【问题标题】:Undefined Procedure in SWI-Prolog does not workSWI-Prolog 中的未定义过程不起作用
【发布时间】:2011-08-22 03:33:04
【问题描述】:

我刚刚开始使用 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 应该“跳过”第一条语句,因为它没有足够的信息,并检查下一行。它确实为第二行提供了足够的信息,因此它应该评估为 true。任何帮助或正确方向的观点都会很棒。谢谢。

【问题讨论】:

    标签: prolog undefined procedure


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      你也可以改变谓词的顺序(不能总是这样做) 但主要是 Kaarel 所说的。

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-01-13
          • 2012-04-06
          • 2011-04-26
          • 1970-01-01
          • 1970-01-01
          • 2015-06-30
          • 1970-01-01
          • 2011-11-11
          相关资源
          最近更新 更多