2

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

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

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

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

4

3 回答 3

5

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

于 2012-03-12T12:17:28.570 回答
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/2或者maplist/3结果将不同。

于 2012-03-12T11:22:08.173 回答
2

在您的两个示例中,它都用作中缀 operator,但具有不同的、不相关的含义。

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

表达式只是二元或一元关系的语法糖,其中函子是运算符。此类表达式的含义由上下文定义:例如,is/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
于 2012-03-12T14:21:50.243 回答