@ <Prolog中的符号

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了@ <Prolog中的符号相关的知识,希望对你有一定的参考价值。

我想知道@<在Prolog中意味着什么?在阅读Bridge和Torch问题时,我在这行代码中遇到了这个符号:

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

但是,使用term,您可以在prolog中比较许多不同类型的对象。比较评估遵循@Ankur给出的链接中描述的规则。要理解这些规则,您需要知道Prolog术语的含义,例如functoratomProlog 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被认为是“不低于”`+(X,3) @< *(2,3).` ? Prolog会在内部将其视为:

Y

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

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

这两个术语都是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,因为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. 运算符,它可以工作:

qazxswpoi

以上是关于@ <Prolog中的符号的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Javadoc 中使用 @ 和 符号格式化代码片段?

Visual Prolog 的 Web 专家系统

未解决的对“片段”部分中的符号“”的引用

jqGrid soap error - 由以下引起:com.ctc.wstx.exc.WstxUnexpectedCharException:prolog中的意外字符'_'(代码95)

在 Prolog 中进行量化的 ZDD

以下代码片段的算法复杂度