在Prolog代码中,可以通过使用“无头”Horn子句将指令传递给编译器,这些子句与左指材料暗示的左边没有头部关系': - '(⇐)。例如,要导入模块或声明Unit Test Code:
:- begin_tests(lists).
:- use_module(library(lists)).
test(reverse) :- reverse([a,b], [b,a]).
:- end_tests(lists).
显然,无头Horn子句的源文件中的位置很重要。
Horn条款
HEAD :- BODY1, BODY2, .... , BODYN
被理解为等同于逻辑表达式
body_1∧body_2∧....∧body_n⇒头
或者,因为这被理解为经典逻辑,使用布尔代数的等价规则:
¬body_1∨bodybody_2∨....∨bodybody_n∨head
在无头条款的情况下,我们因此断言否定:
:- begin_tests(lists).
原则上意味着我们声称begin_tests(lists)
不是真的。
(确实在Answer Set Programming中,上述类别的条款被用作拒绝生成的解决方案的“矛盾”::- move(D,P,T), blocked(D-1,P,T).
表示“移动(D,P,T)永远不是真的)∧被阻挡(D-1,P,T)“,相应地拒绝任何可能的解决方案。)
我理解能够指定代码分隔符,源注释,文件元信息和其他编译器指令的实用需求。但为什么指令使用:-
。使用与逻辑语法完全无关的其他符号,例如,它是否更清晰。传统上由C宏使用的#
。
答案 0 :(得分:3)
在SWI-Prolog中, 是一个干净的替代方案:
你可以写:
?- Goal.
此语法完全类似于查询,如果仔细观察,始终的格式为?- Goal
,即使您没有明确输入的?-
。
答案 1 :(得分:2)
使用与逻辑语法完全无关的其他符号,例如,它是否更清晰,例如传统上由C宏使用的#。
只要您使用Prolog的术语语法,对于horn子句的字面类比就无法工作,因为前缀运算符和后缀运算符都表示相同的术语。空头的子句是:- p.
,空体的子句是p :- .
使用适当的运算符都表示术语:-(p).
因为你可以动态地改变运算符,所以{{1}因此是非常含糊的:它可能表示一个空头的事实或规则。
在Prolog文本中,读取术语:-(p).
称为指令。这是自爱丁堡Prolog以来的情况,自1977年以来。最初(并且仍然在许多当前的实施中),术语:-(Dir).
被简单地视为要执行的目标,并且在失败的情况下产生警告。对于显示答案的查询,使用了术语Dir
,后来成为提示?-(Query).
。也就是说,顶级循环为您打印?-
。
在ISO Prolog中,只定义了一定数量的指令。
7.4.2指令 1动态/ 1。 2多文件/ 1。 3不连续/ 1。 4 op / 3。 5 char_conversion / 2。 6初始化/ 1。 7包括/ 1。 8 ensure_loaded / 1。 9 set_prolog_flag / 2。
一般目标需要包含?-
。在整个Prolog文本准备好执行之后,它们被执行。将此与指令进行对比,这些指令在许多实现中立即执行到目前为止读取的子句的当前状态。
一直无法理解的是系统为指令和initialization/1
问题执行单例变量检查的原因。