gpt4 book ai didi

prolog - @< 序言中的符号

转载 作者:行者123 更新时间:2023-12-04 18:42:46 28 4
gpt4 key购买 nike

我想知道什么@<在 Prolog 中是什么意思?
我在阅读有关桥接和火炬问题时在这行代码中遇到了这个符号:

select_one_or_two(L, [Sel1,Sel2], L2) :- 
select(Sel1, L, NewL),
select(Sel2, NewL, L2),
Sel1 @< Sel2.

最佳答案

@ 开头的比较运算符比那些没有的更普遍。与运营商,如 </2 ,只能比较数值和表达式(涉及文字数值和用数值实例化的变量)。所以,与 </2你可以这样做:

?-  X = 2, Y = 3, X + Y < 2*Y.
X = 2,
Y = 3.

?- X = 2, Y = 3, X + Y > 2*Y.
false.

?-

但是,如果表达式的计算结果不是已知数字,您将在以下情况下收到错误消息:
?- Y = 3, X + Y < 2*Y.
ERROR: </2: Arguments are not sufficiently instantiated

或者:
?- a < b.
ERROR: </2: Arithmetic: `a/0' is not a function

但是,使用 @</2您可以在序言中比较许多不同类型的对象。比较评估遵循@Ankur 提供的链接中描述的规则。要理解这些规则,您需要知道 Prolog 术语的含义,例如 term , functor , atom等(例如,请参见 Prolog Terms )

看一些例子:
?- a @< b.
true.

?- a(1) @< a(2).
true.

?- b(1) @< a(2).
false.

?- 20 @< a.
true.

这些都是非常直接的,遵循规则。这是一个更有趣的案例(从上面):
?- Y = 3, X + Y @< 2*Y.
false.

为什么会 X + Y被认为“不低于” 2*Y ? Prolog 会在内部将其视为:
`+(X,3) @< *(2,3).`

(注意 Y 被实例化为 3 。)这些是复合术语(它们不是单个原子或变量)。如果我们看一下比较规则,匹配规则是:

Compound terms are first checked on their arity, then on their functor name (alphabetically) and finally recursively on their arguments, leftmost argument first.



这两项的元数都是 2。仿函数名称是 +*分别。那些是不同的。在 ASCII 整理序列中, +紧随其后 * .因此, + 是不正确的。 “小于” * ,因此不正确的是 +(X,3) @< *(2,3).因此, Y = 3, X + Y @< 2 * Y. 是不正确的。

另请注意 @</2不计算数字表达式。所以即使是 XY实例化为值,您将获得:
?- X = 2, Y = 3, X + Y @< 2*Y.
false.

而当我们有 </2在这里,这是真的,因为表达式 X + Y < 2*Y ,当评估时,是真的。但是,当变量简单地统一时,它会理解这一点,因此您将拥有:
| ?- X @< Y.

yes

但另一方面:
| ?- X = 2, Y = 1, X @< Y.

no

在这种情况下 X @< Y被视为 2 @< 1由于 X的统一与 2Y1数字规则开始生效。

说了这么多,使用 @</2在谓词中 select_one_or_two使该谓词可用于各种对象的列表,而不仅仅是数字或完全实例化的数字表达式。如果使用过 </2 ,那么以下将起作用:
?- select_one_or_two([2,1,3], X, Y).
X = [2, 3],
Y = [1] ;
X = [1, 2],
Y = [3] ;
X = [1, 3],
Y = [2] ;
false.

但以下失败:
?- select_one_or_two([b,a,c], X, Y).
ERROR: </2: Arithmetic: `b/0' is not a function
?-

然而,随着 @<运营商,它的工作原理:
?- select_one_or_two([b,a,c], X, Y).
X = [b, c],
Y = [a] ;
X = [a, b],
Y = [c] ;
X = [a, c],
Y = [b] ;
false.

关于prolog - @< 序言中的符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21328165/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com