Следующая история из книги Н. Вирта (1976) Алгоритмы + Структуры данных = Программы.Как я могу реализовать «Я - мой собственный дедушка», в Прологе?
Я женился на вдове (назовем ее W) , у которого была взрослая дочь (ее называют D). Мой отец (F), который часто бывал у нас , влюбился в мою дочери и женился на ней. Следовательно, моим отцом стал мой зять, а моя дочь стала моей дочери. Около месяцев спустя моя жена родила сына (S1), который стал зять моего отца, а также как мой дядя. Эта жена моего отца, , то есть моя дочка, также имела сына (S2).
Я пытаюсь смоделировать эти отношения в прологе, так в конце концов, я смогу набрать:
| ?- grandfather(i,i).
И я буду дан «Да» или «Нет» на независимо от того, являюсь ли я своим дедушкой.
Вот код, который я написал до сих пор (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).
Прямо сейчас у меня много проблем с круговыми определений, так что я получаю в бесконечные циклы при выполнении запроса : дед (i, i).
К примеру, у меня есть:
(1 мс) да {след} | ? - дед (i, i). 1 1 Звонок: дед (i, i)?
2 2 Позвоните: grandparent (i, i)?
3 3 Вызов: parent (i, _103)?
4 4 Call: child (_127, i)?
5 5 Call: parent (i, _151)?
6 6 Звонок: ребенок (_175, i)?
7 7 Call: parent (i, _199)?
8 8 Звонок: ребенок (_223, i)?
9 9 Вызов: parent (i, _247)?
10 10 Call: child (_271, i)?
11 11 Call: parent (i, _295)?
12 12 Call: child (_319, i)?
13 13 Call: parent (i, _343)?
14 14 Call: child (_367, i)?
15 15 Вызов: parent (i, _391)?
...
Это происходит потому, что ребенок определяет себя как уже имеющий родитель, и родитель определяет сам имеющий ребенок (как вы увидите в вышеуказанных предикатах я отвечал).
Может ли кто-нибудь помочь мне переопределить свои предикаты для этих отношений, чтобы я мог определить, являюсь ли я своим дедушкой?
Хех, я на самом деле должен был сделать это для моего класса AI. Интересно, есть ли у меня код ... Я посмотрю, когда вернусь домой. Я помню, что это тоже больно моему мозгу. –
Они используют Пролог в Западной Виргине? ;-) –
@ T.E.D .: Shh! TheTXI услышит вас! –