во-первых, спасибо за помощь. Я пишу прологическую программу, описывающую семейные отношения, включая все версии родственников. Здесь есть логика, и мне нужна помощь с прологом, потому что я не очень опытен в этом. Я пытаюсь настроить несколько возможностей для каждого правила с помощью точек с запятой.
То, как я обращаюсь со своими родственниками, заключается в том, что мой зять также является моим братом, поэтому мне нужно несколько проверок, чтобы понять, что является правдой. Я хочу, чтобы пролог вернул 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))).