2014-01-24 70 views
3

我想知道@<在Prolog中意味着什么? 我遇到过这种符号在这行代码一边念叨大桥和火炬问题:@<Symbol In Prolog

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

回答

5

的比较运营商与@启动都比不需要的那些比较一般。对于运算符(如</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的术语意味着,如termfunctor,​​等(参见,例如,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)这些是复合词(他们不是单个原子或变量)。如果我们通过比较规则,匹配规则为:

复合词首先检查自己的元数,然后对他们的仿 名(按字母顺序),最后递归地对他们的论点, 最左边争论第一。

术语元数是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由于统一X2Y1和数字规则踢英寸

说了这么多,如何在谓语使用@</2select_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

谢谢!好的回答:-) – parisa

+0

有点晚了,但是这是一个错字:'在这种情况下,X @ narn

+0

@narn永远不会太迟以修复一个错字!感谢您找到它。 – lurker