Получить «правда; false "набор из двух ответов на набор правил

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

  •  08-10-2019
  •  | 
  •  

Вопрос

Во-первых спасибо, что помогло. Я пишу программу пролога, описывающую семейные отношения, включая все версии родственников. Логика - это все там, что мне нужна помощь, это какой-то пролог, как я не очень опыт с этим. Я пытаюсь настроить несколько возможностей для каждого правила благодаря использованию запятой.

То, как я отношусь к законам, заключается в том, что в законе моего брата также является моим братом, поэтому мне нужны несколько проверок, которые верно. Я хочу пролог возвращать True, и только правда, если какой-либо из вариантов верно. Тем не менее, он возвращает True и False в качестве возможных вариантов, поскольку, конечно, один из вариантов всегда будет ложным, а другой всегда будет правдой. Либо они мой брат в законе, либо мой природный брат. Я не могу получить пролог, чтобы вернуть только правда, и не иметь возможности ложного в качестве другого ответа. Если у кого-нибудь есть совет, это было бы здорово. Соответствующий код включен ниже. Итак, если я печатаю «брат (ребенок, папа)». Я получаю истину и ложь как можно возможные ответы, когда все, что я хочу, это ложно. Однако «брат (папа, детка)». возвращает только правда. Но я сейчас разграничивается. Извините, если какой-либо из кода сбивает с толку с детьми папа. Спасибо!

/*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))).
Это было полезно?

Решение

Эти несколько ответов могут быть предотвращены мета-предикатом once/1:

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

?-

Другие советы

Спасибо за прочтение. Я знаю, что это не самый легкий, чтобы понять. Ребенок выше в наборе фактов, которые вы видите. Ребенок удваивается за тест, чтобы получить родителей. Поэтому, когда я передаю братом (детка, папа), программа, то звонит ребенка (Baby, X) = ребенок (папа, х) дочерняя функция уделяется ребенку, поэтому возвращает родитель. Затем я проверяю, одинаковы ли родители, как это означало бы, что двое - братья.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top