我是序言新手。我尝试了这个简单的程序。
man(rahul).
person(X) :- man(X).
male(X) :- man(X).
female(X) :- \+ man(x).
female(samita).
married(samita, rahul).
loves(X, Y) :- married(X, Y).
married(X, Y) :- married(Y, X).
child(sita, samita, rahul).
loves(X, Y):- child(X, Y , Z).
loves(X, Z):- child(X, Y , Z).
我的查询是。
loves(sita, X).
据我说。答案一定是。
X = rahul.
X = samita.
但在 swi prolog 中,程序并未终止。 有人可以帮我理解我哪里做错了吗。
代码
man(rahul).
person(X) :- man(X).
male(X) :- man(X).
female(X) :- \+ man(x).
female(samita).
married(samita, rahul).
loves(X, Y) :- married(X, Y).
married(X, Y) :- married(Y, X).
child(sita, samita, rahul).
loves(X, Y):- child(X, Y , Z).
loves(X, Z):- child(X, Y , Z).
查询:
loves(sita, X).
要了解程序循环的原因,只需查看以下failure-slice就足够了。 因为这个片段不会终止,你的完整程序也不会终止。
爱(X,Y):-已婚(X,Y),假。爱(X,Y):- 假,孩子(X,Y,Z)。爱(X,Z):- 假,孩子(X,Y,Z)。已婚(萨米塔,拉胡尔):- 假。 已婚(X,Y):-已婚(Y,X),假。 ?- 爱(sita,any),错误。 循环。