Question

Tout d'abord merci pour aider. Je suis en train d'écrire un programme Prolog décrivant les relations familiales, y compris toutes les versions de lois en. La logique est là, ce que je besoin d'aide avec des problèmes est Prolog que je ne suis pas très expérimenté avec elle. Je suis en train de mettre en place de multiples possibilités pour chaque règle grâce à l'utilisation des points-virgules.

La façon dont je traite dans les règlements est pour que mon beau-frère est mon frère, donc je besoin de plusieurs contrôles pour voir ce qui est vrai. Je veux revenir Prolog vrai, et seulement vrai, si l'une des options sont vraies. Cependant, il retourne vrai et faux que les options possibles, depuis bien sûr l'une des options va toujours être faux et l'autre va toujours être vrai. Soit ils sont mon beau-frère, ou mon frère naturel. Je ne peux pas obtenir Prolog pour revenir vrai que, et ne pas avoir la possibilité de faux comme une autre réponse. Si quelqu'un a des conseils que ce serait formidable. code correspondant est inclus ci-dessous. Donc, si je tape « frère (bébé, papa). » Je reçois vrai et faux que les réponses possibles quand tout besoin I est faux. Cependant, "frère (papa, bébé)." ne renvoie true. Mais je radote maintenant. Désolé si tout le code est source de confusion avec les trucs de bébé papa. Merci!

/*facts for relationships*/

female(widow).
female(redhair).

spouse(i,widow).
spouse(widow,i).
spouse(dad,redhair).
spouse(redhair,dad).

child(i,dad).
child(redhair,widow).
child(baby,i).
child(onrun,dad).

male(onrun).
male(baby).
male(dad).
male(i).

/*rules*/
daughter(D,P):-
    female(D), (child(D,P);(spouse(P,S),child(D,S))).
son(D,P):-
    male(D), (child(D,P);(spouse(P,S),child(D,S))).
mother(X,Y):-
    female(X),
    child(Y,X).
father(X,Y):-
    male(X),
    child(Y,X).
son_in_law(C,P):-
    male(C),spouse(C,S),
    (child(S,P);(spouse(P,W),child(S,W))).
daughter_in_law(C,P):-
    female(C),spouse(C,S),
    (child(S,P);(spouse(P,W),child(S,W))).
brother(S1,S2) :- male(S1), 
    (child(S1,P) = child(S2,P2));
    (child(S1,P),child(S2,P2),spouse(P,P2));
    ((child(S1,P),son_in_law(S2,P));(child(S2,P),son_in_law(S1,P))).
Était-ce utile?

La solution

Ces réponses multiples peuvent empêcherions avec le once/1 méta-prédicats:

?- once(brother(baby,dad)).
true.

?-

Autres conseils

Merci pour la lecture. Je sais que ce ne est pas le plus facile à comprendre. enfant est au-dessus de l'ensemble des faits que vous voyez. Enfants multiplié par deux pour un test pour obtenir les parents. Alors, quand je passe frère (bébé, papa) le programme appelle ensuite l'enfant (bébé, X) = enfant (père, X) la fonction enfant est donnée à l'enfant, il retourne le parent. Je vérifie ensuite si les parents sont les mêmes, que cela voudrait dire que les deux sont frères.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top