У меня есть пример типичных отношений.Оператор «или» возвращает только первое заявление
m(thomas).
m(leon).
w(nina).
born(thomas, nina, leon).
born(Father, Mother, Child) :- born(Mother, Father, Child).
father(Father, Child) :- born(Father, Mother, Child), m(Father).
mother(Mother, Child) :- born(Father, Mother, Child), w(Mother).
parent(Parent, Child) :- (father(Parent, Child); mother(Parent, Child)).
Когда я спрашиваю после родителей, отец будут перечислены только:
?- parent(X, leon).
X = thomas ;
X = thomas ;
.....
Я хочу обоих родителей:
?- parent(X, leon).
X = thomas ;
X = nina ;
Что я могу сделать?
Edit: проблема:
Моя проблема была не or
, потому что normally
возвращает оба утверждения.
Проблема заключалась в том, что born/3
, в коде выше, представляет собой цикл. Я пытался заставить друг друга обменяться матерью и отцом.
Edit: исправление:
Я получил два ответа на это от ChristianF и CapelliC. Они оба помогли мне понять, что было не так с моим заявлением.
Мое решение:
m(thomas).
m(leon).
w(nina).
b(thomas, nina, leon).
born(Father, Mother, Child)
:- (m(Father), w(Mother), b(Father, Mother, Child)); b(Mother, Father, Child).
father(Father, Child) :- born(Father,_, Child), m(Father).
mother(Mother, Child) :- born(_, Mother, Child), w(Mother).
parent(Parent, Child) :- (father(Parent, Child); mother(Parent, Child)).
'родился (отец, Мать, Ребенок): - Рожденный (Мать, Отец, Ребенок). «Много проблем. Одна вещь, которая поможет, - создать конвенцию для фактов 'born/3', в которых всегда указывается отец или мать. – lurker
вы действительно должны всегда включать в свои вопросы вывод, который вы получаете, и объяснять, почему это не то, что вы хотели. Я уверен, что это где-то в «Справочном центре» (т. Е. FAQ). Вы включили объяснение, но не сам вывод. –
@mbratch: Это решение, но что-то я не могу сделать. Мне нужно, чтобы отец и мать менялись друг против друга. – Spen