2017-03-06 5 views
0

Ich mag wäre sagen, dass, wenn er Vater ist er ein männliche sonst ist eine weiblicheProlog, Geschlecht mit if_then_else

father(pedro-i,beatriz(1347)). 
father(pedro-i,joão(1349)). 
father(pedro-i,dinis(1354)). 
father(pedro-i,joão_grão_mestre_da_ordem_de_avis). 
mother(constança(1320),luis). 
mother(constança(1320),maria(1342)). 


% I want to say that if is the father then is male else is a female 

IF_then_else(X,Y,Z) :- father(X,Y),male. 
IF_then_else(X,Y,Z) :- female. 

Antwort

2

Eine erste Bemerkung: Prädikate und functors Start mit einem Kleinbuchstaben, nicht einem Großbuchstaben: Großbuchstaben werden für Variablen verwendet.

Sie scheinen den Punkt zu verfehlen, dass Prädikate in Prolog keinen Wert zurückgeben. Sie können nur erfolgreich, oder Fehler (in diesem Sinne sie "zurückgeben" eine boolean). Der Weg zur Bereitstellung (nicht boolescher) Ausgabe besteht darin, Vereinheitlichung zu verwenden.

Hier können Sie dies tun, indem die wörtliche in den Kopf setzen, wie:

if_then_else(X,Y,male) :- father(X,Y). 
if_then_else(X,Y,female).

Aber jetzt gibt es ein weiteres Problem : Prolog Backtracking. Es bedeutet also, dass auch wenn die erste Klausel erfolgreich ist, wird es die zweite Klausel versuchen. So werden pedro-i beide male und female sein. Sie können dieses Problem lösen, indem Sie einen Schutz auf die zweite Klausel setzen, die besagt, dass die Klausel erfolgreich ist, wenn Prolog nicht beweisen kann, dass es eine father(X,Y) Beziehung gibt. Etwas wie:

if_then_else(X,Y,male) :- father(X,Y). 
if_then_else(X,Y,female):- \+ father(X,Y).

Aber dies in einem rechnerisch teuer Problem führen kann: es ist möglich, dass es eine lange Zeit in Anspruch nimmt eine beweisen, dass es father(X,Y). Beziehung, und wenn es keine solche Beziehung ist, in Ermangelung so zu beweisen, dauert noch mehr Zeit (weil Prolog alle Zweige überprüfen muss). Es könnte sogar zu einer Endlosschleife führen. In diesem Fall können Sie einen Schnitt (!) verwenden. Wenn Sie einen Schnitt erreichen, wird Prolog nicht versuchen, Ergebnisse in den folgenden Klauseln des Prädikats zu finden. So können Sie schreiben:

if_then_else(X,Y,male) :- father(X,Y), !. 
if_then_else(X,Y,female).

Alternativ können Sie Prolog des verwenden if-then-else structure und verwenden explizite Vereinigung:

if_then_else(X,Y,Z) :- 
    ( father(X,Y) -> Z = male ; Z = female ).