初学者序言

标签 prolog

我是 prolog 的新手,有一个菜鸟问题:

假设我有这些代码行:

p(1).
p(2):-!.
p(3).

我正在运行 p(X)

问题:我得到 X=1 , X=2
为什么 X 也不等于 3

最佳答案

Prolog 程序是一系列语句,称为子句,形式为

P0  :-  P1, P2, …, Pn.

因此,为了帮助您理解您的问题,您必须了解以下内容:

P0, P1, P2, …, Pn 中的每一个都是一个原子或结构。 句点终止每个 Prolog 子句

声明意义:

“如果 P1P2 以及……和 Pn 为真,则 P0 为真”

程序意义:

“要满足目标P0,满足目标P1 然后 P2 然后……然后 Pn”。

  • P0 称为子句的主要目标。
  • 目标 P1, P2, …, Pn 的组合构成了子句的主体。
  • 没有正文的子句是事实: “P.”表示“P为真”或“目标P满足
  • 没有标题的子句 “:- P1, P2, …, Pn.”或“?- P1, P2, …, Pn.”是一个解释为的查询 “P1 和 P2 以及……和 Pn 是真的吗?” 或 “先满足目标 P1,然后是 P2,然后……然后是 Pn”

Cut 子句包含“!”符号(也发音为 bang)。当 Prolog 解释器看到 cut 符号时,它会删除剩余的规则,这些规则与包含 bang 的规则具有相同的正文字。这会对程序产生多种影响——它可以代表某些负面结果,可以避免或顺利处理失败,或者可以简单地消除部分搜索空间并加快程序速度。

关于初学者序言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13886022/

相关文章:

command-line - 在 SWI Prolog 中使用命令提示符或使用 process_create/3 的 shell 时出错

prolog - 来自嵌套谓词的列表

Prolog:如何查找和删除最小列表元素?

prolog - 在 CLP(FD) 中生成任意长度的列表时不终止

succ/2 的 Prolog 定义

prolog - 不同 clp(FD) 库实现的兼容性

序言 : how to detirmine if there are duplicate element in a list (not consecutive)

c# - 如何将 SWI Prolog 连接到 Visual Studio 2012

prolog - 获取 Prolog 类型的所有元素

prolog - 如何实现完全声明式的 Horn 逻辑?