Иногда я не знаю, что означает "/" в Прологе - PullRequest
2 голосов
/ 12 марта 2012

Я вижу такие слеши в коде:

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

Но иногда я вижу "/ 1" "/ 2" и т. Д. В Прологе.

Что означают эти утверждения (символы)?

Ответы [ 3 ]

5 голосов
/ 12 марта 2012

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

3 голосов
/ 12 марта 2012

Ну, в вашем коде это может быть просто использовано в качестве разделителя. Он служит для сопоставления с образцом посредством унификации:

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, и результат будет другим.

2 голосов
/ 12 марта 2012

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

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

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