我在代码中看到这样使用的斜杠:
solution([X/Y|Others]) :-
noattack(X/Y, Others).
但有时我会在Prolog中看到“/ 1”“/ 2”等。
这些陈述(字符)是什么意思?
答案 0 :(得分:5)
X/Y
是术语/(X, Y)
的中缀语法,即其仿函数为“/”的术语,带有两个参数:X和Y.在这种情况下可以使用中缀语法因为/被定义为ISO Prolog中的默认运算符之一。就像a+b
是术语+(a, b)
的中缀语法一样,X is Y + Z
是is(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/2
或maplist/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