2013-08-24 4 views
4

Я знаю, что Prolog (программирование в логике) относится к возврату true и false, а функция - это что-то, что возвращает что-либо из списков, чисел в логические значения. Первоначально это не кажется, что Пролог имеет понятие функций, но вместо этого полагается на объединение, но вы можете сделать такие вещи, как:Определяющая (математическая) функция в Prolog

?- X is log(42). 
X = 3.7376696182833684. 

Таким образом, кажется, что существуют функции? Или это действительно просто какой-то синтаксический сахар, скрывающий часть объединения?

И если это действительно просто синтаксический сахар, то как бы я пошел, если бы хотел определить математическую «функцию», такую ​​как log2?

Конечно, я могу использовать объединение:

log2(X,Result) :- Result is log(X)/log(2). 

Но сказать, что я хочу использовать «стиль функции синтаксического сахара», так что я могу написать:

?- X is log2(8). 
X = 3.0. 

Как я могу это сделать в Прологе ?

+2

Существует устаревшая директива 'arithmetic_function', которая будет делать то, что вы хотите. Предполагая, что существует предикат 'log2/2', директива': - arithmetic_function (log2/1) .' сделает ваш второй образец работы. Я не уверен, почему он устарел, но, похоже, все еще работает в 6.2.6. –

+0

Я тоже задавался вопросом об этом устаревании, о чем спросить Яна У. Подход Деннис М. любит брать с Амзи! Prolog должен определить альтернативу «is» (например, 'iz/2' с синтаксисом infix) и построить правила, которые оценивают любые дополнительные функции. – hardmath

ответ

4

Так что это просто объединение ..(Благодаря mbratch и коврик для объяснения)

Это, как я решить мою исходную задачу, и тем самым делает мой код более читаемым при использовании самостоятельно определенные математические функции:

:- op(900, xfy, <-). 
R <- log2(Y) :- R is log(Y)/log(2), !. 

% the two predicates below solves the problem with using mathematical operators 
% together with self defined functions note that they should always be last 
% 
R <- X :- 
    compound(X), 
    X =..[OP, X2, X3], 
    R2 <- X2, 
    R3 <- X3, 
    Expr =..[OP, R2, R3], 
    R is Expr, !. 
R <- X :- R is X, !. 

то я могу написать:

?- X <- log2(8). 
X = 3.0. 

и, кроме того, последние два предиката делает возможным написать соединения, такие как:

?- X <- 17*log2(8) - 2. 
X = 49.0. 

Обратите внимание, что вы не можете возиться с является/2, и поэтому я вроде отменяют его, используя свой собственный < - оператор вместо

EDIT: добавлен синтаксический сахар предложенный мат и добавил два предиката, которые устраняют проблемы при использовании вновь определенного лог2 в сочетании с другими математическими операторами.

+1

Вы также можете использовать свой новый оператор infix также в заголовке предложения: 'R <- log2 (Y): - R is ...'. – mat

+0

ах, это еще более удивительно, большое спасибо. – Michelrandahl

+0

Директива 'op' - это интересно играть и может дать вам интересные и полезные синтаксические подходы к представлению предикатов. 'is' является встроенным предикатом, поэтому вы не можете изменить то, что имеет определение' is'. :) – lurker

8

Пролог об описании Отношения между объектами. Поскольку математическая функция является особым видом отношения (которое связывает входные данные с однозначно определенным выходом), вы можете использовать Prolog для описания таких функций. В вашем примере, предикат, который реализует это соотношение называется is/2 и (is)/2 также определена как оператор инфиксного в Прологе, так что вы можете написать:

?- X is log(42).

вместо формы префикса (который, конечно, также все еще допустимо):

?- is(X, log(42)).

Обратите внимание, что is/2 выполняет арифметические оценки выражений, и объединяет первый аргумент с результатом. Это отличается от объединения X с термином Prolog log(42).

Примечание хотя это is/2 не истинное отношение, потому что вы не можете использовать его в другом направлении:

?- 0 is log(X). 
ERROR: is/2: Arguments are not sufficiently instantiated 

Решение этого заключается в том, чтобы использовать ограничения (например, над вещественными числами, называется CLP (R)), которые работают во всех направлениях. Они доступны как библиотеки или встроенные модули во многих современных системах Prolog.

Смежные вопросы