Câu chuyện sau đây là từ N. Wirth's (1976) Thuật toán + Cấu trúc = Chương trình.Làm thế nào tôi có thể thực hiện, "Tôi là ông của riêng tôi", trong Prolog?
Tôi kết hôn với một góa phụ (chúng ta hãy gọi W cô) người đã có một con gái trưởng thành (gọi cô ấy D). Cha tôi (F), người đã đến thăm chúng tôi khá thường xuyên, đã yêu cô gái con gái và cưới cô ấy. Do đó, cha tôi đã trở thành con rể của tôi và con gái bước của tôi đã trở thành mẹ tôi. Một số tháng sau đó, vợ tôi đã sinh một con trai (S1) , người trở thành người anh em của cha tôi, cũng như là người chú của tôi. Người vợ của cha tôi, đó là, con gái riêng của tôi, cũng có một con trai (S2).
Tôi đang cố gắng để mô hình hóa các mối quan hệ trong prolog vậy cuối cùng tôi sẽ có thể gõ:
| ?- grandfather(i,i).
Và tôi sẽ nhận được một "Yes", hoặc "Không" trên có hay không tôi là ông nội của tôi.
Đây là mã tôi đã viết cho đến nay (grandpa.pl):
aunt(X,Y):-
sibling(X,Z),
parent(Z,Y),
female(X).
brother(X,Y):-
sibling(X,Y),
male(X).
brother_in_law(X,Y):-
child(X,Z),
married(Z,W),
parent(W,Y),
not(sibling(X,Y)),
male(X).
brother_in_law(s1,f).
child(X,Y):-
parent(Y,X).
daughter(X,Y):-
parent(Y,X),
child(X,Y),
female(X).
daughter(d,w).
father(X,Y):-
parent(X,Y),
male(X).
father(f,i).
father_in_law(X,Y):-
child(X,Z),
married(Y,Z),
not(child(X,Y)),
male(X).
grandparent(X,Y):-
parent(X,Z),
parent(Z,Y).
grandmother(X,Y):-
grandparent(X,Y),
female(X).
grandfather(X,Y):-
grandparent(X,Y),
male(X).
grandchild(X,Y):-
child(X,Z),
child(Z,Y).
married(X,Y):-
wife(X,Y),
female(X).
married(X,Y):-
husband(X,Y),
male(X).
married(i,w).
married(f,d).
mother(X,Y):-
parent(X,Y),
female(X).
parent(X,Y):-
child(Y,X).
sibling(X,Y):-
parent(Z,X),
parent(Z,Y).
sister(X,Y):-
sibling(X,Y),
female(X).
son(X,Y):-
parent(Y,X),
male(X).
son(s1,w).
son(s2,d).
son_in_law(X,Y):-
child(X,Z),
not(child(X,Y)),
married(Z,Y),
male(X).
son_in_law(f,i).
step_daughter(X,Y):-
child(X,Z),
married(Z,Y),
not(child(X,Y)),
female(X).
step_daughter(d,i).
step_parent(X,Y):-
married(X,Z),
parent(Z,Y),
not(parent(X,Y)).
step_father(X,Y):-
step_parent(X,Y),
male(X).
step_mother(X,Y):-
step_parent(X,Y),
female(X).
step_mother(d,i).
uncle(X,Y):-
sibling(X,Z),
parent(Z,Y),
male(X).
uncle(s1,i).
Ngay bây giờ tôi đang gặp rất nhiều rắc rối với các định nghĩa hình tròn vì vậy mà tôi nhận được vào vòng lặp vô hạn khi chạy truy vấn : ông nội (i, i).
Ví dụ, tôi có:
(1 ms) có {trace} | ? - ông nội (i, i). 1 1 Gọi: ông nội (i, i)?
2 2 Gọi: ông bà (i, i)?
3 3 Gọi: cha mẹ (i, _103)?
4 4 Gọi: con (_127, i)?
5 5 Gọi: phụ huynh (i, _151)?
6 6 Gọi: con (_175, i)?
7 7 Gọi: cha mẹ (i, _199)?
8 8 Gọi: con (_223, i)?
9 9 Gọi: phụ huynh (i, _247)?
10 10 Gọi: con (_271, i)?
11 11 Gọi: phụ huynh (i, _295)?
12 12 Gọi: con (_319, i)?
13 13 Gọi: cha mẹ (i, _343)?
14 14 Gọi: con (_367, i)?
15 15 Gọi: cha mẹ (i, _391)?
...
Điều này là do con tự định nghĩa như đã có một phụ huynh, và phụ huynh xác định mình đã có một đứa con (như bạn sẽ thấy trong các vị từ trên tôi đã đăng).
Có ai có thể giúp tôi xác định lại các vị từ của mình cho các mối quan hệ này để tôi có thể xác định xem tôi có phải là ông của riêng tôi không?
Heh, tôi thực sự đã phải làm điều đó cho lớp AI của tôi. Tôi tự hỏi nếu tôi vẫn còn mã ... Tôi sẽ nhìn khi tôi về nhà. Tôi nhớ nó cũng làm tổn thương não tôi. –
Họ sử dụng Prolog ở West Virgina? ;-) –
@ T.E.D .: Shh! TheTXI sẽ nghe bạn! –