#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).