我在代码中看到这样使用的斜杠:
solution([X/Y|Others]) :-
noattack(X/Y, Others).
但有时我会在 Prolog 中看到“/1”“/2”等。
这些陈述(字符)是什么意思?
我在代码中看到这样使用的斜杠:
solution([X/Y|Others]) :-
noattack(X/Y, Others).
但有时我会在 Prolog 中看到“/1”“/2”等。
这些陈述(字符)是什么意思?
X/Y
是术语的中缀语法/(X, Y)
,即函子为“/”的术语,带有两个参数:X 和 Y。在这种情况下可以使用中缀语法,因为 / 被定义为 ISO Prolog 中的默认运算符之一. 就像a+b
术语的中缀语法+(a, b)
和.X is Y + Z
的中缀语法一样is(X, +(Y, Z))
。
好吧,在您的代码中,它可能只是用作分隔符。它通过统一用于模式匹配目的:
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
结果将不同。
在您的两个示例中,它都用作中缀 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