在Prolog中定义规则时遇到麻烦

时间:2020-10-11 23:53:02

标签: prolog

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

如果B已嫁给A,则A已嫁给B
我了解按原样编写它会创建一个循环,但是我不知道如何防止这种情况。

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

我也无法做这样的事情。

如果ParentChild的父项:-
Parent的配偶是Child的父母。

1 个答案:

答案 0 :(得分:2)

制作两个单独的谓词。首先,您定义一个列出事实的谓词:

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

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

我也无法执行以下操作:

如果ParentChild的父项:- Parent的配偶是Child的父母。

语法parent(married(Parent, Spouse), Child).没有多大意义,因为married(Parent, Spouse)在这里是一个函子。即使Prolog将其视为谓词,该谓词也不会“返回”任何内容。谓词是对还是错。

您可以定义一个parent_fact/2谓词:

parent_fact(phillip, charles).

然后定义一个谓词:

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