【问题标题】:Prolog and the headless implicationProlog 和无头含义
【发布时间】: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


    【解决方案1】:

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

    你可以写:

    ?- 目标。

    此语法与 查询 完全相似,如果您仔细观察,总是 格式为 ?- Goal,即使您没有明确输入 @ 987654322@.

    【讨论】:

      【解决方案2】:

      使用与逻辑语法完全无关的其他符号会不会更简洁,例如# 传统上由 C 宏使用。

      只要您使用 Prolog 的术语语法,就不能像喇叭子句那样进行字面类比,因为前缀运算符和后缀运算符都表示相同的术语。带有空头的子句是:- p.,带有空主体的子句是p :- . 使用适当的运算符都表示术语:-(p). 由于您可以动态更改运算符,因此术语:-(p). 是高度模糊的:它可能表示一个空头的事实或规则。

      在 Prolog 文本中,读取术语 :-(Dir). 称为 指令。自爱丁堡 Prolog 以来就是如此,即自 1977 年以来。最初(并且仍然在许多当前实现中)术语 Dir 被简单地视为要执行的目标,并在失败时产生警告。对于显示答案的查询,使用了术语?-(Query).,后来成为提示符?-。也就是说,顶层循环会为您打印?-

      在 ISO Prolog 中,只定义了选定数量的指令。

      7.4.2 指令 1动态/1。 2 多文件/1。 3 不连续/1。 4 操作/3。 5 字符转换/2。 6初始化/1。 7 包括/1。 8 确保加载/1。 9 set_prolog_flag/2.

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

      我一直无法理解的是,为什么系统会对指令和?- 问题执行单例变量检查。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-12
        • 2014-01-30
        • 1970-01-01
        相关资源
        最近更新 更多