Conseguir “verdadero; falsa”conjunto de dos respuestas para un conjunto de reglas

StackOverflow https://stackoverflow.com/questions/3946231

  •  08-10-2019
  •  | 
  •  

Pregunta

En primer lugar gracias por ayudar. Estoy escribiendo un programa de prólogo que describe las relaciones familiares, incluyendo todas las versiones de la familia política. La lógica es todo lo que hay, lo que necesito es ayuda con algunos problemas de prólogo, ya que no soy muy experimentado con ella. Estoy tratando de configurar múltiples posibilidades para cada regla a través del uso del punto y coma.

La forma en que estoy tratando a la familia política es para que mi cuñado es también mi hermano, así que necesito múltiples comprobaciones para ver cual es cierto. Quiero prólogo a devolver verdadero, y sólo es cierto, si alguna de las opciones son ciertas. Sin embargo, devuelve verdadero y falso como posibles opciones, ya que, por supuesto, una de las opciones siempre va a ser falso y el otro siempre va a ser verdad. O bien son mi cuñado, o mi hermano natural. No puedo conseguir prólogo para volver verdad solamente, y no tener la opción de la falsa como otra respuesta. Si alguien tiene algún consejo que sería genial. código en cuestión se incluye a continuación. Por lo tanto, si escribo "hermano (el bebé, papá)". Consigo verdadero y falso como posibles respuestas cuando lo único que quiero es falsa. Sin embargo, el "hermano (papá, bebé)." Sólo devuelve verdadero. Pero estoy divagando ahora. Lo siento si cualquier parte del código es confundir con la materia padre del bebé. Gracias!

/*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))).
¿Fue útil?

Solución

Estas respuestas múltiples pueden estar impidiendo la once/1 meta-predicado:

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

?-

Otros consejos

Gracias por leer. Sé que no es la más fácil de entender. niño está por encima en el conjunto de hechos que se ven. Niño dobla para una prueba de que los padres. Así que cuando paso en el hermano (el bebé, padre) el programa llama a continuación niño (bebé, X) = niño (padre, X) la función niño se le está dando al niño, por lo que devuelve la matriz. entonces puedo comprobar para ver si los padres son los mismos, ya que eso significaría que los dos son hermanos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top