10
votes

Comment puis-je mettre en œuvre, "Je suis mon propre grand-père", à Prolog?

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> xxx pré>

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 commentaires

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


4 Réponses :


4
votes

Mon cours de PRologit a été difficile il y a longtemps, mais qu'en est-il de supprimer xxx

et de remplacer tout usage de parent (A, B) avec Enfant (B, A) ? 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.

C'est le même n'est pas?


0 commentaires

2
votes

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).


0 commentaires

6
votes

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).


0 commentaires

0
votes

Voici les faits et règles xxx

requête xxx


0 commentaires