有时我不知道Prolog中的“/”是什么意思

时间:2012-03-12 08:57:34

标签: prolog iso-prolog

我在代码中看到这样使用的斜杠:

solution([X/Y|Others]) :-
   noattack(X/Y, Others).

但有时我会在Prolog中看到“/ 1”“/ 2”等。

这些陈述(字符)是什么意思?

3 个答案:

答案 0 :(得分:5)

X/Y是术语/(X, Y)的中缀语法,即其仿函数为“/”的术语,带有两个参数:X和Y.在这种情况下可以使用中缀语法因为/被定义为ISO Prolog中的默认运算符之一。就像a+b是术语+(a, b)的中缀语法一样,X is Y + Zis(X, +(Y, Z))的中缀语法。

答案 1 :(得分:3)

好吧,在您的代码中,它可能只是用作分隔符。它通过统一用于模式匹配目的:

A-B = 1-2.

将返回

A = 1,
B = 2.

因为我们使用分隔符-来帮助匹配内容。这里的分隔符是/

在您描述谓词时,您会看到/1/2的另一个地方。

somepredicate/arity表示谓词somepredicate需要arity个参数。 例如:

% member/2 : member(?Element, ?List)
member(Element, [Element|_Tail]).
member(Element, [_Head|Tail]) :-
    member(Element, Tail).

这里我们的第一行说成员有2个参数。 例如,在swi-prolog中,也可以使用此表单来指定您在谓词中定位的谓词,例如listing/1:您可以将其作为参数传递maplist/2maplist/3结果会有所不同。

答案 2 :(得分:2)

在您的示例中,它都用作中缀运算符,但具有不同的,无关的含义。

在第一条规则中,你引用它只是一个分隔符,正如Mog已经指出的那样。 另一种用途,主要用于文档目的,它作为谓词指标。很有用,因为我们可以使用相同的仿函数使用不同的谓词。

对于二元或一元关系,表达式只是 syntax sugar ,其中functor是一个运算符。这些表达式的含义由上下文定义:例如,/ 2负责表达式的算术计算:这里运算符执行预期的算术运算

?- X is 10 / 3.
X = 3.3333333333333335.

内置current_op允许检查操作员的定义。尝试

   ?- current_op(Precedence,Associativity,/).
   Precedence = 400,
   Associativity = yfx .

我们可以有一个名为/的谓词。一个愚蠢的例子:

/(A, B) :- format(A, B).

或更好

A / B :- format(A, B).

可以用作我们有多种格式的速记。不鼓励这种用法,导致难以阅读的程序,但是根据这样的定义,这是一个有效的规则:

?- 'hello ~s' / [world].
hello world