【发布时间】:2016-12-16 01:12:19
【问题描述】:
在 Prolog 代码中,可以使用“无头”Horn 子句将指令传递给编译器,这些子句与指向左侧的物质蕴涵 ':-' (⇐) 的左侧没有头关系。例如,导入模块或声明Unit Test Code:
:- begin_tests(lists).
:- use_module(library(lists)).
test(reverse) :- reverse([a,b], [b,a]).
:- end_tests(lists).
显然,无头 Horn 子句在源文件中的位置很重要。
喇叭子句
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). 的意思是“move(D,P,T) ∧blocked( D-1,P,T)",相应地拒绝任何可能的解决方案。)
我了解能够指定代码分隔符、源注释、文件元信息和其他编译器指令的实际需求。但是为什么指令使用:-。使用与逻辑语法完全无关的其他符号会不会更干净,例如# 传统上由 C 宏使用。
【问题讨论】:
标签: prolog