Prolog 如何消除单例变量错误?

Prolog 如何消除单例变量错误?,prolog,Prolog,我应该实现一个蒙蒂Python电影中的一个小序言程序,人们在那里争论一个女人是否是女巫。根据传说,女巫被烧死了,但木头也被烧死了,木头可以漂浮,鸭子也可以漂浮,所以,如果有人的体重和鸭子一样,她是木头做的,因此,她是女巫 基于此,我得出了以下结论: witch(X) :- burns(X), female(X). burns(X) :- wooden(X). wooden(X) :- floats(X). floats(X) :- sameWeight(duck, X). female(X).

我应该实现一个蒙蒂Python电影中的一个小序言程序,人们在那里争论一个女人是否是女巫。根据传说,女巫被烧死了,但木头也被烧死了,木头可以漂浮,鸭子也可以漂浮,所以,如果有人的体重和鸭子一样,她是木头做的,因此,她是女巫

基于此,我得出了以下结论:

witch(X) :- burns(X), female(X).
burns(X) :- wooden(X).
wooden(X) :- floats(X).
floats(X) :- sameWeight(duck, X).

female(X). 
sameweight(duck, X).
但当我想检查X是否是女巫时,通过尝试女巫(X)。它实际上打印了“true”,确认这个女人是女巫,但我也收到了一条
Singleton variables:[X]
错误消息。很明显,我在某个地方有一个bug,我想修复它。

这些都是警告。它指定在子句中使用变量once in。以下情况中的
X

female(X). 
sameweight(duck, X).

请注意,现在您已经编写了所有内容都是
女性
,并且所有内容的权重都与
鸭子

相同,我看到了一个实现,其中:女性(女孩)。和sameWeight(鸭子,女孩)。这背后的逻辑是什么?我的意思是,为什么这样做?对于
girl
你指定
girl
是女性。在这里,您指定所有内容都是一个
female
,因此
X
仍然是一个自由变量,并且您将对所有值进行谓词操作。@JorgePadilla
X
是一个变量
girl
duck
不是变量,而是原子(如果愿意的话,是特定的常量值)。
female(_). 
sameweight(duck, _).