【问题标题】:Prolog: comparing predicate value with constantProlog:将谓词值与常量进行比较
【发布时间】:2015-10-01 09:21:41
【问题描述】:

我在使用 prolog 时遇到了一些问题,特别是我无法将谓词的值与常量进行比较。

predicate(9).
compare(X,Y) :- X<Y.

运行程序:

?-compare(predicate(X),10).

为什么它不起作用?谢谢你的回答。

【问题讨论】:

  • 尝试按照自己的方式完成教程,应该是非常基本的东西吗?

标签: prolog compare logic yap


【解决方案1】:

谓词不会像函数那样返回值。

这是C:

int nine() { return 9; }

int main() {
    int x = nine(); /* x is now 9 */
}

这是序言:

% source
nine(9).

% from the top level
?- nine(X).
X = 9.

?- nine(X), X < 10.
X = 9.

?- nine(X), compare(C1, X, 10), compare(C2, 10, X).
X = 9,
C1 =  (<),
C2 =  (>).

几件事(尽量不要使用过多的 Prolog 术语):

你的predicate/1和我的nine/1所做的是将它唯一的参数与整数9统一。如果统一成功,谓词成功,现在参数绑定到9。如果统一失败,谓词失败。

?- nine(9).
true.

?- nine(nine).
false.

?- nine(X), nine(Y).
X = Y, Y = 9.

您还会注意到有一个标准谓词compare/3 可用于比较 Prolog 术语。因为谓词不像函数那样有返回值,所以它使用一个额外的参数来报告比较的结果。您可以尝试以下方式:

% greater_than(X, Y) : true if X is greater than Y according
%                      to the standard order of terms
greater_than(X, Y) :- X @> Y.

但这只是为@&gt;/2 定义一个别名,它本身就是一个谓词(但已被声明为运算符,以便您可以在中缀表示法中使用它)。

?- @>(a, b).
false.

?- @>(b, a).
true.

&lt;/2 也是如此,它是用于比较算术表达式的谓词:

?- 2 + 4 =< 6.
true.

?- nine(X), X > 10 - X.
X = 9.

?- nine(X), X > 10.
false.

【讨论】:

    【解决方案2】:

    就像@Boris 之前所说的“谓词不会像函数那样返回值。” 在这里,您必须尝试在规则的头部实例化变量。
    如果您尝试使用谓词 compare/2 来查找大于 Y 的数字 X,同时该数字 X 应该是事实 predicate/1,则将这两个条件添加到您的规则主体或谓词 compare/2

    predicate(9).
    compare(X,Y) :- predicate(X), X<Y.
    

    现在如果您咨询:

    ?- compare(X,10).
    

    答案是

    X = 9
    

    如您所见,9 小于 10,同时 9 是事实predicate/1。这就是您要寻找的返回值

    注意

    请注意,运算符 &gt;/2 要求双方都实例化,因此在这种情况下,您将无法在谓词中请求值 Y

    ?- compare(9, Y)
    </2: Arguments are not sufficiently instantiated
    

    也许,如果有意义的话,您也可以尝试将此变量实例化为事实predicate/1

    predicate(9).
    predicate(10).
    compare(X,Y) :- predicate(X), predicate(Y), X<Y.
    
    ?- compare(9,Y).
    Y = 10
    

    【讨论】:

    • 感谢大家的回答。我解决了我的问题:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多