【问题标题】:What does a clause without a head mean in prolog?序言中没有头的子句是什么意思?
【发布时间】:2013-01-05 03:47:11
【问题描述】:

在 Prolog 程序的开头我看到:

:-dynamic(path/1).

这似乎是一个没有头的子句。什么意思?

【问题讨论】:

    标签: prolog iso-prolog prolog-directive-dynamic


    【解决方案1】:

    当 Prolog 解释器在加载程序时在子句前面看到 :- 时,子句会立即执行,而不是成为程序“数据库”的一部分。 :- 最常见的用法是在程序文件的末尾定义程序的起始谓词,以便用程序加载文件使其运行。

    具体来说,dynamic/1informs the interpreter that the definition of the specified predicate may change at runtime。这是解释者在阅读程序的其余部分之前需要了解的内容,以便它可以对path/1 谓词的使用做出特殊安排。

    【讨论】:

      【解决方案2】:

      在 Prolog 文本中,主函子 (:-)/1 的术语是指令。

      dynamic 指令具有以下效果:

      • 定义了谓词P/N,即使没有给出子句。默认情况下,为不带任何子句的谓词执行目标会导致存在错误。
      • 谓词可以被asserta/1rectract/1 等改变。默认情况下,谓词是静态的,尝试修改它会导致权限错误。
      • 可以使用clause/2 检查子句。默认情况下,谓词是私有的,使用clause/2 进行检查会导致权限错误。在某些系统(如 SWI)上,所有用户定义的谓词都是公共的,因此可以使用 clause/2 进行检查。因此在 SWI 中无法观察到这种效果。

      许多实现将未知的指令视为常规目标并执行它们。但是,在执行这些目标的精确时间点方面,实现方式存在很大差异。重新加载文件时,它们的差异更大。

      如果您想确保在准备执行 Prolog 文本之后立即执行目标,请使用指令 initialization/1

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-13
        • 1970-01-01
        • 2023-03-31
        • 2022-01-28
        • 2022-01-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多