Проблема с определением правил в Prolog

#prolog

#prolog

Вопрос:

 married(man, woman).
married(B, A) :- 
  married(A, B)
  

Если B женат на A , A женат на B .
Я понимаю, что написание его так, как у меня, создает цикл, но я не знаю, как это предотвратить.

 parent(Parent, Child) :- 
    parent(married(Parent, Spouse), Child).
  

Я также не могу сделать что-то подобное.

Если Parent является родителем Child :-
супруг Parent является родителем Child .

Комментарии:

1. В старые времена вы могли зарезервировать одну позицию для мужчины, а другую для женщины.

Ответ №1:

Создайте два отдельных предиката. Сначала вы определяете предикат, в котором перечислены факты:

 married_fact(philip, elisabeth).
married_fact(william, kate).

married(X, Y) :-
    married_fact(X, Y).
married(X, Y) :-
    married_fact(Y, X).  

Я также не могу сделать что-то подобное:

Если Parent является родителем Child :- супруг Parent является родителем Child .

Синтаксис parent(married(Parent, Spouse), Child). не имеет особого смысла, поскольку married(Parent, Spouse) здесь является функтором. Даже если Prolog будет рассматривать это как предикат, предикат ничего не «возвращает». Предикат имеет значение true или false.

Вы можете определить parent_fact/2 предикат:

 parent_fact(phillip, charles).
  

а затем определите предикат:

 parent(Parent, Child) :-
    parent_fact(Parent, Child).
parent(Parent, Child) :-
    married(Parent, Spouse),
    parent_fact(Spouse, Child).