Получение "true; false" набора из двух ответов для набора правил - PullRequest
2 голосов
/ 16 октября 2010

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

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

/*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))).

Ответы [ 2 ]

1 голос
/ 16 октября 2010

Эти множественные ответы могут быть предотвращены с помощью мета-предиката

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

?-
0 голосов
/ 16 октября 2010

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

...