Prolog:子句不在源文件中

int*_*lis 21 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).
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

Warning: Clauses of female/1 are not together in source-file
Warning: Clauses of male/1 are not together in source-file
Run Code Online (Sandbox Code Playgroud)

这个错误的目的是什么?
我的意思是,文件编译并运行得很好,我知道错误的含义.但为什么?
这只是强制执行最佳做法的通知吗?

我对逻辑编程很新.
谢谢!

das*_*ght 14

正确,这是强制执行最佳实践的警告,即将所有相关子句放在源文件中.除此之外,源文件中的子句彼此接近并不重要,只要它们的相对顺序不变.

  • @intelis你应该修复单例变量警告:它们更重要,因为一个小错字可能会使你的规则不正确.我曾经不得不调试其他人的Prolog程序,作者忽略了这个警告.问题是他犯了一个错字 - 他在一个长度为23个字符的变量名中间放了一个大写的"O"代替,而忽略了一个警告.如果确实需要单个变量,只需将其替换为下划线即可使警告静音. (2认同)
  • @intelis 单例变量是在规则的整个主体中仅使用一次的变量(即以大写字母开头的标识符)。单例变量可以与任何东西统一,但不使用统一的结果。有时这是合法的,在这种情况下,您应该将变量重命名为“_”。然而,很多时候它是由于不正确地大写原子(即使用`female(Jane).`而不是`female(jane).`)或拼错变量名的结果。 (2认同)

mnd*_*rix 6

警告鼓励最佳做法,并帮助发现拼写错误.这是一个错字的例子:

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

smell(sweet).
smell(pungent).
small(floral).
Run Code Online (Sandbox Code Playgroud)

这个错误很难被发现,但幸运的是编译器警告:

Warning: /tmp/test.pl:7:
Clauses of small/1 are not together in the source-file
Run Code Online (Sandbox Code Playgroud)

通过警告和行错误,可以更快地找到并更正拼写错误.

ISO Prolog提供了discontiguous/1针对特定谓词静音此警告的指令.见规范的7.4.2.3节.它的使用方式如下:

:- discontiguous small/1.
Run Code Online (Sandbox Code Playgroud)