在 Prolog 程序的开头,我看到:
:-dynamic(path/1).
这似乎是一个没有头的子句。这是什么意思?
在 Prolog 程序的开头,我看到:
:-dynamic(path/1).
这似乎是一个没有头的子句。这是什么意思?
当 Prolog 解释器:-
在加载程序时看到子句前面时,该子句会立即执行,而不是成为程序“数据库”的一部分。最常见的用法:-
是在程序文件的末尾定义程序的起始谓词,以便用程序加载文件使其运行。
具体来说,dynamic/1
通知解释器指定谓词的定义可能会在运行时更改。这是解释者在阅读程序的其余部分之前需要了解的内容,以便它可以对path/1
谓词的使用做出特殊安排。
在 Prolog 文本中,具有主函子的术语(:-)/1
是指令。
指令具有dynamic
以下效果:
P/N
即使没有给出子句,也定义了谓词。默认情况下,为没有任何子句的谓词执行目标会导致存在错误。asserta/1
等改变rectract/1
。默认情况下,谓词是静态的,尝试修改它会导致权限错误。clause/2
. 默认情况下,谓词是私有的,检查 withclause/2
会导致权限错误。在某些系统(如 SWI)上,所有用户定义的谓词都是公共的,因此可以使用clause/2
. 因此在 SWI 中无法观察到这种效应。许多实现将未知的指令视为常规目标并执行它们。但是,在执行这些目标的精确时间点方面,实现方式存在很大差异。重新加载文件时,它们的差异更大。
如果要确保在准备执行 Prolog 文本后立即执行目标,请使用指令initialization/1
。