为什么谓词和函数未在Prolog中明确分开?

问题描述 投票:0回答:1

考虑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首先在术语上下文中使用,然后在谓词上下文中使用。可能在谓词上下文中根本不应允许使用变量。

从数学的角度来看这不是一些基本的设计不一致吗?

prolog symbolic-math swi-prolog discrete-mathematics first-order-logic
1个回答
0
投票

[在逻辑的第二部分:https://en.wikipedia.org/wiki/Fluent_(artificial_intelligence)中,有一个很好地描述逻辑中使用的“函数”的示例。

基本的想法是,尽管术语“愤怒(tom)”是谓词(因此是对还是错),说明汤姆很生气;如果predicate成为另一个谓词[* 1]的参数,则可以将predicate变为function:因此,对于if(angry(tom),true) :: if现在是predicate angry(tom)function。[* 1]这似乎与OP相关。

© www.soinside.com 2019 - 2024. All rights reserved.