Учитывая, что у вас есть female/1
& male/1
предикат, предикат становится довольно простым.
marriedcouple(X,Y) :-
parent( (X,Z), bornin(_) ),
parent( (Y,Z), bornin(_) ),
female(X),
male(Y).
Однако, если вы хотите увидеть, не совпадают ли X и Y, используйте оператор (\==)/2
для «не идентичен» или (\=)/2
для «не различим».
<Ч />
Прадип, основываясь на вашем комментарии ниже, вот более полное решение.
Чтобы не допустить повторения одного и того же ответа дважды, есть несколько вариантов. Мы можем создать список решений и добавить только что найденное решение, если его еще нет в списке. Или используйте подход, который включает состояние с использованием предиката assert/1
.
Я выбрал последнее.
?- solve.
solve :-
marriedcouple(Dad, Mum),
not( found( marriedcouple(Dad, Mum) ) ),
assert( found( marriedcouple(Dad, Mum) ) ),
write( [Dad, Mum] ),
nl,
fail.
marriedcouple(Dad, Mum) :-
parent(Dad, Child),
parent(Mum, Child),
male(Dad),
female(Mum).
male(aaron).
male(adam).
female(betty).
female(eve).
parent(aaron, callum).
parent(aaron, david).
parent(adam, abel).
parent(adam, cain).
parent(betty, callum).
parent(betty, david).
parent(eve, abel).
parent(eve, cain).
Когда я запускаю это, я получаю следующее:
[aaron,betty];
[adam,eve];
No.
Будьте осторожны, используя предикаты assert/1
, так как вы можете вносить нежелательные побочные эффекты в свои программы. Вам также может потребоваться сделать соответствующие retract/1
звонки.