【问题标题】:How to define a predicate in prolog如何在prolog中定义谓词
【发布时间】:2009-12-03 23:42:49
【问题描述】:

我是 Prolog 的新手,到目前为止我已经学会了如何在文件中定义谓词并运行解释器来使用它。但我想知道是否有办法在 ?- 提示符处定义谓词,这样我就不必来回切换了。

我现在的做法是这样的

文件 defs.pl:

adjacent(1,2).
adjacent(1,3).

在序言解释器中:

?- consult('defs.pl').
% defs.pl compiled 0.00 sec, 122 bytes
true.
?- adjacent(1,2).
true.

编辑 也许我的意思是我不确定如何定义“事实”。

【问题讨论】:

    标签: prolog


    【解决方案1】:

    您可以使用assert/1 谓词:

    ?- assert(adjacent(1,4)).
    true
    

    编辑: 顺便说一句,如果您尝试将它与文件中定义的谓词结合起来,这将不起作用。 因此,要么在文件中定义所有相邻/2 谓词,要么在命令行中使用 assert 定义它们。

    如果您确实想在文件中定义一些谓词,而其他谓词则使用 assert,则在您的文件中声明谓词是动态的:

    % file contents
    :- dynamic(adjacent/2).
    adjacent(1,2).
    adjacent(1,3).
    

    【讨论】:

      【解决方案2】:

      你可以的

      ?- consult(user).
      

      ?- [user].
      

      然后输入子句,然后以文件结尾字符终止输入(Linux中的Ctrl-D,MS-Windows中的Ctrl-Z)。这相当于读取文件,见the documentation of consult/1

      assert/1 和retract/1 用于由代码动态更改的谓词(即用于存储全局数据),而不是用于正常编程。

      【讨论】:

      • 我同意这可能是它们的设计目的,但我不认为使用这些(因为它们可用)来快速测试和学习 prolog 有什么问题。开销不应该是一个问题。虽然我认为您的解决方案更简洁,但当您想要添加更多谓词时,它还需要您重新输入您已经定义的所有谓词。