Получить «правда; false "набор из двух ответов на набор правил
-
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) = ребенок (папа, х) дочерняя функция уделяется ребенку, поэтому возвращает родитель. Затем я проверяю, одинаковы ли родители, как это означало бы, что двое - братья.