Prolog 序言:源文件中的子句不在一起

Prolog 序言:源文件中的子句不在一起,prolog,iso-prolog,Prolog,Iso Prolog,我有一段代码: % Family tree female(pen). male(tom). male(bob). female(liz). female(pat). female(ann). male(jim). parent(pam, bob). parent(tom, bob). parent(tom, liz). parent(bob, ann). parent(bob, pat). parent(pat, jim). 我得到这个错误: Warning: Clauses of fema

我有一段代码:

% Family tree
female(pen).
male(tom).
male(bob).
female(liz).
female(pat).
female(ann).
male(jim).

parent(pam, bob).
parent(tom, bob).
parent(tom, liz).
parent(bob, ann).
parent(bob, pat).
parent(pat, jim).
我得到这个错误:

Warning: Clauses of female/1 are not together in source-file
Warning: Clauses of male/1 are not together in source-file
此错误的目的是什么?
我的意思是,文件编译和运行都很好,我知道错误的含义。但为什么呢?
这只是一个强制执行最佳实践的通知吗

我对逻辑编程非常陌生。

谢谢

正确,这是实施最佳实践的警告,即将所有相关子句放在源文件中。除此之外,只要它们的相对顺序没有改变,源文件中的子句彼此之间的接近程度并不重要。

警告鼓励最佳实践,并有助于发现拼写错误。下面是一个打字错误示例:

small(ant).
small(fly).
small(molecule).

smell(sweet).
smell(pungent).
small(floral).
错误很难发现,但幸运的是编译器警告:

Warning: /tmp/test.pl:7:
Clauses of small/1 are not together in the source-file
有了警告和行错误,就可以更快地发现和纠正打字错误

ISO Prolog提供了
uncontriguous/1
指令来消除特定谓词的此警告。见本规范第7.4.2.3节。其使用方式如下:

:- discontiguous small/1.

有办法把它关掉吗?有时候我就是不能那样写代码。@intelis有一种方法可以告诉Prolog您打算在()中散布子句。谢谢,但这不仅仅是子句。我收到了很多不同的警告,比如单例变量等@intelis你应该修复单例变量警告:它们更重要,因为一个小的输入错误会使你的规则不正确。我曾经不得不调试别人的Prolog程序,而作者忽略了这个警告。问题是他做了一个排错——他在一个23个字符长的变量名的中间放置了一个0代替大写<代码> o>代码,忽略了警告。如果您确实需要一个单例变量,只需将其替换为下划线即可消除警告。@intelis单例变量是一个在整个规则体中只使用一次的变量(即,以大写字母开头的标识符)。单例变量与任何对象统一,但不使用统一的结果。有时,这是合法的,在这种情况下,您应该将变量重命名为
\uuu
。然而,这通常是由于不正确地将原子大写(即使用
女性(Jane)。
而不是
女性(Jane)。
)或拼写错误导致的。对于那些不知道如何修复它的人:将关系分组(在本例中为
男性
女性
)根据关系的名称,如何对其进行分组?