我想知道你在Prolog中不能表达什么样的句子?我一直在研究逻辑编程,并且已经了解到,与Prolog所基于的明确子句逻辑(Horn子句)相比,一阶逻辑更具表现力。对我而言,这是一个艰难的课题。
因此,例如,可以表达以下句子:
For all cars, there does not exist at least 1 car without an engine
如果是,是否还有其他句子无法表达?如果没有,为什么?
答案 0 :(得分:3)
您可以使用否定(\+
)直接使用Prolog表达您的句子。
E.g:
car(bmw).
car(honda).
...
car(toyota).
engine(bmw, dohv).
engine(toyota, wenkel).
no_car_without_engine:-
\+(
car(Car),
\+(engine(Car, _))
).
如果每辆车都有引擎,程序no_car_without_engine/0
将会成功,否则会失败。
答案 1 :(得分:3)
Prolog中最有问题的定义是那些左递归的定义。 像
这样的定义g(X) :- g(A), r(A,X).
由于Prolog的搜索算法是普通的深度优先搜索,最容易失败 并将运行到无限及更远。
Horn Clauses的一般问题是,它们被定义为最多只有一个正面元素。也就是说,人们可以找到一个仅限于这些条件的条款, 例如:
A ∨ B
因此,∀ X: cat(X) ∨ dog(X)
等事实无法直接表达。
有办法解决这些问题,并且有办法允许这些陈述(见下文)。
阅读材料:
These slides(第3页)给出了一个 使用Prolog无法构建的句子示例。
This work(第10页)也解释了Horn条款及其含义,并介绍了一种允许“无效”Horn条款的方法。
答案 2 :(得分:2)
Prolog是一种编程语言,而不是一种自然语言界面。
你所表达的句子是以一种令人费解的方式表达的,以至于我很难理解它。实际上,我必须感谢gusbro以痛苦的方式用可理解的方式来表达它。但他完全掩盖了任何编程语言在应用于自然语言时所构成的知识表示问题,甚至只是简单地在一阶逻辑中否定。这些问题非常紧迫,所选择的语言通常被认为是“不重要的”。
与编程有关,Prolog缺乏在O(1)(恒定时间)内访问任何线性数据结构(即数组)的能力。然后,例如,需要访问O(1)中的数组元素的QuickSort无法以有效的方式实现。
但它仍然是图灵完整的语言,值得拥有。然后有没有语句无法在Prolog中表达。
答案 3 :(得分:0)
因此,您正在寻找无法用一阶逻辑表达的句法逻辑中表达的句子。
严格来说,有很多,仅仅因为条款逻辑是对FOL的限制。所以这是定义的。 你可以做的是你可以将任何一组FOL句子重写成一个逻辑程序,它不是等价的,但具有良好的属性。因此,例如,如果您想知道 p 是否是理论的结果,您可以使用等效的转换逻辑程序。
关于其他答案的几点说明: