Prolog和无头的暗示

时间:2016-12-16 01:12:19

标签: prolog

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

2 个答案:

答案 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问题执行单例变量检查的原因。