5

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

hacker(P) :- mountaindew(P), doesntsleep(P).
hacker(P) :- writesgoodcode(P).
writesgoodcode(jeff).

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

writesgoodcode(jeff).

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

?- hacker(jeff).
ERROR: hacker/1: Undefined procedure: mountaindew/1
   Exception: (7) hacker(jeff) ? 

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

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

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

?- hacker(jeff).
true.

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

4

3 回答 3

5

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

  1. 定义这个谓词
  2. 声明这个谓词是动态的:dynamic(mountaindew/1)
  3. 声明所有未知谓词都应该失败(不推荐):set_prolog_flag(unknown, fail)
于 2011-05-10T07:06:28.807 回答
0

您还可以更改谓词的顺序(不能总是这样做),但主要是 Kaarel 所说的。

最后,即使您仍在开发代码,编写总是会失败的东西也没有任何意义

于 2011-05-10T08:46:26.507 回答
0

这行得通,但由于我是初学者,我不能说为什么。“未实例化”一词可能适用。尽管不知道它为什么起作用,但我认为展示一种有效的方式是有帮助的。

hacker(P) :- mountaindew(P), doesntsleep(P).
hacker(P) :- writesgoodcode(P).
mountaindew(john).
doesntsleep(john).
writesgoodcode(jeff).
于 2012-07-22T23:58:03.553 回答