2012-03-12 4 views

ответ

2

В обоих примерах он используется как операционный оператор , но с другим, не связанным, значением.

В первом правиле вы цитируете, что это просто разделитель, как уже указывал Мог. Другое использование, в основном для целей документации, является индикатором предиката. Полезно, потому что у нас могут быть разные предикаты с одним и тем же функтором.

Выражения только синтаксис сахара для двоичных или унарных отношений, где функтор является оператором. означает таких выражений определяется контекстом: например, является/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 
+3

Я нахожу пример «формата» довольно приятным; Полагаю, вы имели в виду, что использование оператора «/» для этого варианта использования не рекомендуется; однако, я думаю, когда вы определяете, например, новый оператор, например «f», чтобы писать «hello-s» f [world], на самом деле это довольно хорошо. В общем, я думаю, что возможность писать (расширяемый) синтаксис infix - огромное преимущество Prolog более сложного для чтения таких языков, как Lisp. Абстрактное синтаксическое дерево все еще полностью регулярно, и конкретный синтаксис гораздо удобнее для арифметики и т. Д. Win-win! – mat

+2

Я также подумал, что, но в списке SWI-Prolog я получил сильную рекомендацию против него. Злоупотребление операторами - это болезнь, так называемая «оператоз» :) – CapelliC

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-прологе, чтобы указать, какой предикат вы используете в предикатах, таких как listing/1: там вы можете перейти в качестве аргумента maplist/2 или maplist/3, и результат будет другим.

+0

Спасибо, я думаю, что ваш ответ мне очень помогает. –

5

X/Y является инфиксным синтаксис для термина /(X, Y), то есть термин, которого функтор «/», с двумя аргументами: X и Y. Можно использовать синтаксис инфиксную в этом случае, так как/определено как одно из операторы по умолчанию в ISO Prolog. Точно так же, как a+b является синтаксисом infix для термина +(a, b) и X is Y + Z является синтаксисом infix для is(X, +(Y, Z)).