【问题标题】:In Prolog, how to represent a(X) => b(X) V c(X)?在 Prolog 中,如何表示 a(X) => b(X) V c(X)?
【发布时间】:2020-08-19 12:34:43
【问题描述】:

我认为是:(b(X); c(X)) :- a(X).

但它会显示错误: 错误:无权修改静态过程 `(;)/2' 错误:定义在 c:/program files/swipl/boot/init.pl:320

我只是找不到正确的语法。

【问题讨论】:

  • 你没有。 Prolog 不是答案集编程。语法由 horn 子句 组成。
  • “你没有”是什么意思?你的意思是a(X) => b(X) V c(X) 不能用prolog表示?还是有办法?
  • @WillemVanOnsem 你甚至可以在 ASP 中做到这一点吗?
  • @DavidTonhofer:是的,请参阅cs.cmu.edu/~cmartens/asp-notes.pdf 的第 7 节或web.stanford.edu/~vinayc/logicprogramming/html/… 的练习 7 当然,并非所有(简单)ASP 求解器本身都支持这一点。
  • @WillemVanOnsem 谢谢。这太棒了。

标签: prolog


【解决方案1】:

你不能用老式的 Prolog 来表达这一点。

您只能编写由 Horn 子句组成的程序,它们有一个正的头部和一个空的(如果是事实)或非空的(如果是规则)主体。

q(X).
b(X) :- a(X).

这些没问题。其他任何东西都是未定义的。

虽然拥有它肯定会很有趣。

事实上,允许讨论形式的逻辑程序称为“析取逻辑程序”。这是一个积极的研究和工程方向。例如DLV 系统,它实际上是基于 Datalog 的,因此不允许使用函数符号。

【讨论】:

  • 当然,从哲学上讲,你可以做到。您只需要在 Prolog 之上编写适当的证明系统。这是 1998 年的一篇论文:Disjunctive Logic Program = Horn Program + Control Program。嗯,在您没有时间研究的两个有趣想法之间,还有另一个您也没有时间研究的有趣想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-21
  • 2014-09-20
  • 2015-08-15
  • 2022-04-11
  • 1970-01-01
  • 2012-08-27
相关资源
最近更新 更多