@< Prolog中的符号

时间:2014-01-24 08:48:44

标签: prolog

我想知道@<在Prolog中的含义是什么? 在阅读Bridge and Torch问题时,我在这行代码中遇到了这个符号:

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

1 个答案:

答案 0 :(得分:6)

@开头的比较运算符比不使用</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

但是,使用term可以比较prolog中的许多不同类型的对象。比较评估遵循@Ankur给出的链接中描述的规则。要理解这些规则,您需要知道Prolog术语的含义,例如functoratom?- a @< b. true. ?- a(1) @< a(2). true. ?- b(1) @< a(2). false. ?- 20 @< a. true. 等(例如,参见Prolog Terms)< / p>

看一些例子:

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

遵循规则,这些非常简单。这是一个更有趣的案例(来自上面):

X + Y

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

Y

(注意3被实例化为+。)这些是复合词(它们不是单独的原子或变量)。如果我们查看比较规则,匹配规则是:

  

首先在 arity 上检查复合词,然后在仿函数上检查   名称(按字母顺序),最后递归他们的参数,   最左边的论点首先。

两个术语 arity 为2. 仿函数名称分别为*+。那些是不同的。在ASCII整理顺序中,*位于+之后。因此,*“小于”+(X,3) @< *(2,3).并非如此,因此Y = 3, X + Y @< 2 * Y.不正确因此,@</2

不正确

另请注意,X不会计算数值表达式。因此,即使将Y?- 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 @< 1X2Y的统一以及数字1@</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.

但是,使用{{1}}运算符,它可以运行:

{{1}}