Frage

Zunächst einmal Dank für die Unterstützung. Ich schreibe ein Prolog-Programm Familienbeziehungen zu beschreiben, einschließlich aller Versionen von in-Gesetze. Die Logik ist alles da, was ich brauche Hilfe bei der es einige Prologs Probleme, da ich sehr bin nicht mit ihm erlebt. Ich versuche, mehrere Möglichkeiten für jede Regel durch die Verwendung von Semikolons einzurichten.

So wie ich in-Gesetze bin zu behandeln, ist so, dass mein Schwager ist auch mein Bruder, so dass ich mehrere überprüft, muß die wahr ist. Ich mag Prolog true zurück, und nur wahr, wenn eine der Optionen wahr ist. Allerdings gibt es wahr und falsch als mögliche Optionen, da natürlich eine der Optionen immer sein wird, falsch und der andere ist immer wahr sein wird. Entweder sind sie mein Schwager, oder mein natürlicher Bruder. Ich kann nicht bekommen Prolog nur wahr zurückzukehren, und habe nicht die Möglichkeit, falsch als eine andere Antwort. Wenn jemand einen Rat hat, würde es groß sein. Relevante Code ist unten enthalten. Also, wenn ich "Bruder (Baby, Dad)." Eingeben Ich wahr und falsch wie möglich Antworten, wenn alles, was ich will falsch ist. Doch "Bruder (Papa, Baby)." nur gibt true zurück. Aber ich abschweifend jetzt. Sorry, wenn irgendeiner der Code ist verwirrend mit dem Baby Papa Sachen. Dank!

/*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))).
War es hilfreich?

Lösung

Diese können mehr Antworten mit der Meta-Prädikat once/1 verhindert werden:

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

?-

Andere Tipps

Dank für das Lesen. Ich weiß, es ist nicht die am einfachsten zu verstehen. Kind ist oben in der Reihe von Fakten, die Sie sehen. Kind verdoppelt für eine Test Eltern zu bekommen. Also, wenn ich in Bruder übergeben (Baby, Dad) das Programm dann Kind ruft (Baby, X) = Kind (Vater, X) das Kind Funktion das Kind gegeben wird, so dass es die Eltern zurückkehrt. Ich überprüfen, um dann zu sehen, wenn die Eltern die gleichen sind, wie das würde bedeuten, dass die beiden Brüder.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top