SWI-Prolog 中的未定义过程不起作用

Mat*_*att 6 procedure prolog undefined

我刚刚开始使用 Prolog,并且已经在一个看似简单的示例中遇到了问题。这是我的 .pl 文件:

hacker(P) :- mountaindew(P), doesntsleep(P).
hacker(P) :- writesgoodcode(P).
writesgoodcode(jeff).
Run Code Online (Sandbox Code Playgroud)

然后,在将程序加载到 swipl 中后,我在提示符下用这一行测试它

writesgoodcode(jeff).
Run Code Online (Sandbox Code Playgroud)

我以为它会显示 true,但我收到此错误:

?- hacker(jeff).
ERROR: hacker/1: Undefined procedure: mountaindew/1
   Exception: (7) hacker(jeff) ? 
Run Code Online (Sandbox Code Playgroud)

该程序运行良好,但这并不能解决我的问题:

hacker(P) :- writesgoodcode(P).
writesgoodcode(jeff).

$ swipl -s dumb.pl
% dumb.pl compiled 0.00 sec, 1,112 bytes

?- hacker(jeff).
true.
Run Code Online (Sandbox Code Playgroud)

谁能解释为什么我原来的程序不起作用?根据我的理解,Prolog 应该“跳过”第一条语句,因为它没有足够的信息,并检查下一行。它确实有足够的信息用于第二行,因此它应该评估为真。任何帮助或正确方向的观点都会很棒。谢谢。

Kaa*_*rel 6

正如错误消息所示,您有一个未定义的过程mountaindew/1。要使您的代码返回 true,您的选择是:

  1. 定义这个谓词
  2. 声明该谓词是动态的:dynamic(mountaindew/1)
  3. 声明所有未知谓词都应该失败(不推荐):set_prolog_flag(unknown, fail)