考虑this Prolog程序:
a(1).
b(X) :- X.
这在SWI Prolog中有效。并且以下查询在没有任何警告的情况下给出了令人满意的结果(乍看之下):
?- b(a(1)).
true
?- b(a(2)).
false
然后我不清楚,为什么允许这样做。
事实a(1).
说谓词 a/1
与参数1
相同。
查询b(a(1))
询问谓词b/1
是否为a(1)
功能值是正确的。解决此查询后,a(1)
被检查为predicate,但是它是从谓词自变量上下文中获取的,该上下文仅应允许terms。
所以不同的概念在这里很混乱。根据它们的论点,我们有谓词可能是对,也可能是假。而且我们有符号函数,它们是由函子和参数定义的一些抽象(符号)值。该函数不必返回true或false,它可能是完全不同的域。这里唯一具有功能的动作可能是将其用作谓词中的术语,以陈述一些有关其价值的规则和事实。
对我来说,规则b(X) :- X.
似乎不可编译,因为变量X首先在术语上下文中使用,然后在谓词上下文中使用。可能在谓词上下文中根本不应允许使用变量。
从数学的角度来看这不是一些基本的设计不一致吗?
[在逻辑的第二部分:https://en.wikipedia.org/wiki/Fluent_(artificial_intelligence)中,有一个很好地描述逻辑中使用的“函数”的示例。
基本的想法是,尽管术语“愤怒(tom)”是谓词(因此是对还是错),说明汤姆很生气;如果predicate成为另一个谓词[* 1]的参数,则可以将predicate变为function:因此,对于if(angry(tom),true)
:: if
现在是predicate 和angry(tom)
是function。[* 1]这似乎与OP相关。