没有头的条款在prolog中意味着什么?

hpn*_*hpn 5 prolog iso-prolog

在Prolog程序的开头,我看到:

:-dynamic(path/1).
Run Code Online (Sandbox Code Playgroud)

这似乎是一个没有头脑的条款.这是什么意思?

das*_*ght 6

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

具体来说,dynamic/1 通知解释器指定谓词的定义可能在运行时更改.阅读程序的其余部分之前,这是互操作者需要知道的事情,因此它可以对path/1谓词的使用做出特殊安排.


fal*_*lse 5

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

指令dynamic具有以下作用:

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

许多实现将未知的指令视为常规目标并执行它们。然而,就执行这些目标的精确时间点而言,实施情况存在很大差异。重新加载文件时,它们的差异更大。

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