2016-12-16 23 views
3

在Prolog代码中,可以使用“无头”Horn子句将指令传递给编译器,该子句与左指向的材料含义左侧无关:''(⇐)。例如,导入模块或声明Unit Test Code序言和无头暗示

:- begin_tests(lists). 
:- use_module(library(lists)). 

test(reverse) :- reverse([a,b], [b,a]). 

:- end_tests(lists). 

显然无头Horn子句的源文件中的位置是非常重要的。

A喇叭子句

HEAD :- BODY1, BODY2, .... , BODYN 

理解可以等同于逻辑表达式

body_1∧body_2∧....∧body_n⇒头

或,因为这是理解为经典逻辑,使用布尔代数的等价规则:

¬body_1∨¬body_2∨....∨¬body_n∨头

在无头条款的情况下,我们因此断言否定:

:- 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宏使用的#

回答

1

如果使用与逻辑语法完全无关的其他符号(例如,传统上由C宏使用的#。

只要您使用Prolog的术语语法,由于前缀运算符和后缀运算符都表示相同的术语,因此与horn子句的文字类比不起作用。空头的子句是:- p.,空子句的子句是p :- .适当的操作符都表示术语:-(p).由于您可以动态更改操作符,因此术语:-(p).因此非常含糊:它可能表示事实或规则空头。

在Prolog文本中,读取项:-(Dir).被称为指令。自从1977年以来,爱丁堡Prolog就是如此。原来(并且仍然在许多当前的实施中),术语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。

一般目标需要用initialization/1包装。它们在之后执行整个Prolog文本已准备好执行。将其与在许多实现中立即使用当前读取的子句状态立即执行的指令进行对比。

什么总是逃脱我的理解是为什么系统执行指令和?-问题的单身变量检查。

2

在SWI-Prolog的,有这个干净的替代方案:

你可以写:

 
?- Goal. 

这句法完全类似于查询,其中,如果你仔细观察,总是的形式为?- Goal,即使您没有明确输入  ?-