在 Prolog 中我们可以编写非常简单的程序,如下所示:
\nmammal(dog).\nmammal(cat).\n\nanimal(X) :- mammal(X).\n
Run Code Online (Sandbox Code Playgroud)\n最后一行使用的符号:-
非正式地让我们将最终事实解读为:如果X 是哺乳动物,那么它也是动物。
我开始学习 Prolog 并试图确定符号表示以下哪一个:-
另外,我不太清楚这三者之间的区别。我正在尝试阅读这样的线程,但讨论的水平超出了我的能力,https://math.stackexchange.com/questions/286077/implies-rightarrow-vs-entails-models-vs-provable-vdash。
\n我的想法:
\n:-
意味着“语法蕴涵”。然而,这只适用于作为该语法过程的结果而被证明为真的查询。:-
用于创建事实数据库,因此本质上是语义的。这意味着它可能是 Implies (\xe2\x87\x92) 或 Entails (\xe2\x8a\xa8) 之一,但我不知道是哪一个。两者都不。或者,如果有的话,那就是暗示。其他符号如上,即元语言。Mathematics Stack Exchange 的答案很好地解释了这一点。
那么为什么:-
没有那么大的含义,请考虑:
p :- p.
在逻辑上,两个真值都使其成为一个有效的句子。但在 Prolog 中我们坚持使用最小模型。亦是如此。p
false
Prolog 使用谓词逻辑的子集,因此实际上只有一个最小模型。更糟糕的是,Prolog 的实际默认执行策略使其成为无限循环。
然而,最直观的阅读方式LHS :- RHS.
是将其视为生成新知识的一种方式。如果RHS
这是真的,那么这也是LHS
真的。这样就可以避免所有与暗示相关的悖论。
从右到左的方向有点违反直觉。这个方向是由 Prolog 的实际执行策略(在此表示中从左到右)推动的。