Как остановить повторы в правилах в прологе - PullRequest
2 голосов
/ 17 марта 2010

В моем прологе правило

marriedcouple(X,Y) :-
    parent( (X,Z), bornin(_) ),
    parent( (Y,Z), bornin(_) ),
    female(X),
    male(Y)
    ;
    male(X),
    female(Y),
    different(X,Y).

когда у родителя двое детей, пара показывает дважды. Как мы можем предотвратить это?

Ответы [ 2 ]

2 голосов
/ 17 марта 2010

Учитывая, что у вас есть 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 звонки.

1 голос
/ 22 марта 2010

Просто теоретическое решение через двойное не:

marriedcouple(Dad, Mum) :-
    male(Dad), female(Mum),
    not(notMarriedcouple(Dad,Mum)).

notMarriedcouple(Dad, Mum) :-
    male(Dad), female(Mum),
    not((parent(Dad, Child), parent(Mum, Child))).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...