L'histoire suivante provient de N. Wirth (1976) Algorithmes + DataStructures = Programmes. em> J'ai épousé une veuve (appelons-la w)
qui avait une fille adulte (l'appelle
RÉ). Mon père (F), qui nous a rendu visite
assez souvent, tombé amoureux de mon
belle-fille et la marménée. D'où,
mon père est devenu mon gendre et mon
La belle-fille est devenue ma mère. Certains
mois plus tard, ma femme a donné naissance à un
fils (S1), qui deviennent le
beau-frère de mon père, aussi bien
comme mon oncle. Cette épouse de mon père,
c'est-à-dire ma belle-fille, a également eu un
fils (S2). P>
blockQuote> Je tente de modéliser ces relations à Prologs, ce qui sera finalement en mesure de taper: p> et je serai donné un " Oui ", ou un" non "sur si je suis mon propre grand-père. P> Voici le code que j'ai écrit jusqu'à présent (grand-père): p>
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).
4 Réponses :
Mon cours de PRologit a été difficile il y a longtemps, mais qu'en est-il de supprimer et de remplacer tout usage de C'est le même n'est pas? P> P> parent (A, B) code> avec
Enfant (B, A) CODE>? Vous pouvez toujours ajouter des faits sur les parents car la règle inverse est toujours disponible - vous pouvez également supprimer celui-ci mais dans ce cas, vous ne pouvez plus utiliser de faits sur les parents et vous devrez écrire tous vos faits comme enfant (A, B) aussi. P>
Notez que ma connaissance de prologule est vieille (et jamais si profonde) ...
Je pense que vous devez faire des parents (ou un enfant) primaire (non dépendant d'autres relations). P>
child(X,Y):- parent(Y,X). parent(X,Y):- child(Y,X).
J'ai supprimé tout ce qui n'était inutile dans votre code et j'ai changé quelques choses et c'est ce que j'ai fini par:
% son_in_law(f,i). % step_mother(d,i).
Voici les faits et règles requête p>
Heh, je devais faire ça pour ma classe IA. Je me demande si j'ai toujours le code ... je vais regarder quand je rentre à la maison. Je me souviens que ça fait mal mon cerveau alors aussi.
Avant de lire l'histoire complète, je pensais (espéré) Nous traiterions des nazoses passées
Je pense avoir trouvé un simple Solution , répondant à une autre question récente
Comment personne n'a trouvé que le commentaire de @esbenskovpedersen utile? +1