Domanda

Prima di tutto grazie per l'aiuto. Sto scrivendo un programma Prolog che descrive i rapporti familiari, tra cui tutte le versioni di suoceri. La logica è tutto lì, quello che ho bisogno di aiuto con qualche problema di prologo come io non sono molto esperto con esso. Sto cercando di impostare più possibilità per ogni regola attraverso l'uso di un punto e virgola.

Il modo in cui mi sto curando in-leggi è così che mio cognato è anche mio fratello, quindi ho bisogno di più controlli per vedere che è vero. Voglio prologo di tornare vero, e solo vero, se una qualsiasi delle opzioni sono vere. Tuttavia, restituisce vero e falso come possibili opzioni, dal momento che, naturalmente, una delle opzioni sta andando sempre di essere falsa e l'altro sta andando sempre essere vero. O sono mio cognato, o mio fratello naturale. Non posso ottenere prologo per tornare solo vero, e non hanno la possibilità di falso come un'altra risposta. Se qualcuno ha qualche consiglio, sarebbe fantastico. Codice in materia è riportato qui di seguito. Quindi, se digito "fratello (bambino, papà)." Ottengo vero e falso, come possibili risposte, quando tutto quello che voglio è falso. Tuttavia, "il fratello (padre, bambino)." restituisce vero solo. Ma sto divagando ora. Scusate se qualsiasi del codice confonde con la roba del bambino del papà. Grazie!

/*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))).
È stato utile?

Soluzione

Queste risposte multiple possono essere impediscono con la once/1 meta-predicato:

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

?-

Altri suggerimenti

grazie per la lettura. So che la sua non è il più facile da capire. bambino è al di sopra della serie di fatti che si vede. Bambino raddoppia per un test per ottenere i genitori. Così, quando mi passa a fratello (bambino, papà) il programma chiama allora bambino (bambino, X) = bambino (papà, X) la funzione bambino viene dato al bambino, quindi restituisce il genitore. Ho quindi controllare per vedere se i genitori sono gli stessi, in quanto ciò significherebbe che i due sono fratelli.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top