L'histoire suivante est tirée de N. Wirth (1976) Algorithms + Datastructures = Programs.Comment puis-je implémenter, "Je suis mon propre grand-père", dans Prolog?
J'ai épousé une veuve (appelons-la W) qui avait une fille adulte (appeler D). Mon père (F), qui nous rendait souvent visite, est tombé amoureux de ma belle-fille et l'a épousée. Par conséquent, mon père est devenu mon beau-fils et ma belle-fille est devenue ma mère. Certains mois plus tard, mon épouse a donné naissance à un fils (S1), qui est devenu le beau-frère de mon père, ainsi que comme mon oncle. Cette femme de mon père, qui est, ma belle-fille, avait aussi un fils (S2).
Je tente de modéliser ces relations Prolog donc finalement je serai en mesure de taper:
| ?- grandfather(i,i).
et je serai donné un « oui » ou un « non » sur si je suis ou non mon propre grand-père.
Voici le code que je l'ai écrit à ce jour (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).
En ce moment, je vais avoir beaucoup de mal avec les définitions circulaires pour que je sois dans une boucle infinie lors de l'exécution de la requête : grand-père (i, i).
Par exemple, j'ai:
(1 ms) oui {trace} | ? - grand-père (i, i). 1 1 Appel: grand-père (i, i)?
2 2 Appel: grand-parent (i, i)?
3 3 Appel: parent (i, _103)?
4 4 Appel: enfant (_127, i)?
5 5 Appel: parent (i, _151)?
6 6 Appel: enfant (_175, i)?
7 7 Appel: parent (i, _199)?
8 8 Appel: enfant (_223, i)?
9 9 Appel: parent (i, _247)?
10 10 Appel: enfant (_271, i)?
11 11 Appel: parent (i, _295)?
12 12 Appel: enfant (_319, i)?
13 13 Appel: parent (i, _343)?
14 14 Appel: enfant (_367, i)?
15 15 Appel: parent (i, _391)?
...
C'est parce que l'enfant se définit comme a avoir un parent et parent lui-même définit a avoir un enfant (comme vous le verrez dans les prédicats ci-dessus) que j'ai posté.
Quelqu'un peut-il m'aider à redéfinir mes prédicats pour ces relations afin que je puisse déterminer si je suis mon propre grand-père?
Heh, j'ai eu en fait de le faire pour ma classe AI. Je me demande si j'ai encore le code ... Je regarderai quand je rentrerai à la maison. Je me souviens que ça me faisait mal au cerveau aussi. –
Ils utilisent Prolog dans West Virgina? ;-) –
@ T.E.D .: Shh! TheTXI vous entendra! –