我想知道@<
在Prolog中意味着什么? 我遇到过这种符号在这行代码一边念叨大桥和火炬问题:@<Symbol In Prolog
select_one_or_two(L,[Sel1,Sel2],L2) :-
select(Sel1,L,NewL),
select(Sel2,NewL,L2),
[email protected]<Sel2.
我想知道@<
在Prolog中意味着什么? 我遇到过这种符号在这行代码一边念叨大桥和火炬问题:@<Symbol In Prolog
select_one_or_two(L,[Sel1,Sel2],L2) :-
select(Sel1,L,NewL),
select(Sel2,NewL,L2),
[email protected]<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
,等(参见,例如,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
不计算数字的表达式。因此,即使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 @< 1
由于统一X
与2
和Y
与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.
谢谢!好的回答:-) – parisa
有点晚了,但是这是一个错字:'在这种情况下,X @
narn
@narn永远不会太迟以修复一个错字!感谢您找到它。 – lurker