3

Как реализован предикат «/ 2» Prolog? Я знаю, чтоProlog 'is/2' предикатная реализация

X is 3*4 

эквивалентна

is(X, 3*4) 

Но предикат реализован с использованием императивного программирования? Иными словами, является ли реализация эквивалентной со следующим кодом C?

if(uninstantiated(x)) 
{ 
    X = 3*4; 
} 
else 
{ 
    //signal an error 
} 

Или он реализован с использованием декларативного программирования и других предикатов?

ответ

1

Зависит от вашего Пролога, очевидно, но любая практическая реализация будет выполнять свою грязную работу на С или на другом императивном языке. Часть is/2 может быть смоделирована в чистом Прологе:

is(X, Expr) :- 
    evaluate(Expr, Value), 
    (var(X) -> 
     X = Value 
    ; 
     X =:= Value 
    ). 

Где evaluate огромный предикат, который знает об арифметических выражениях. Есть способы реализовать большие части этого в чистом Prolog тоже, но это будет медленным и болезненным. Например. если у вас есть предикат, который добавляет целые числа, то вы можете умножить их, а также с помощью следующего (глупого) алгоритма:

evaluate(X + Y, Value) :- 
    % even this can be done in Prolog using an increment predicate, 
    % but it would take O(n) time to do n/2 + n/2. 
    add(X, Y, Value). 
evaluate(X * Y, Value) :- 
    (X == 0 -> 
     Value = 0 
    ; 
     evaluate(X + -1, X1), 
     evaluate(X1, Y, Value1), 
     evaluate(Y + Value1, Value) 
    ). 

Всего это гарантировано будут либо практические или правильный; Я просто показываю, как может быть выполнена арифметика в Prolog.

+0

спасибо. И как предикат инкремента может быть реализован в Prolog (для реализации «is/2»). Я просмотрел его, но я только нашел реализации инкремента, используя 'is/2'. Я прошу все это, потому что мне любопытно, может ли Пролог быть чистым (как в, «все является предикатом»). – octavian

+0

@octavian 'is/2' - предикат. Если вы имеете в виду, что 'is' должен работать в обоих направлениях, вы понимаете, что для общего случая это не совсем полезно (2 равно 1 + 1; 2 равно 0 + 2; 2 равно 4/2; 2 - sqrt (4); ...). Однако программирование логики ограничения приближается к тому, что вы, вероятно, имеете в виду. –

+0

Прочитав ответ более внимательно, это не совсем правильно. Скорее всего, if/else в вашем примере для 'is/2' не требуется; вместо этого вы оцените _Expr_ и попытаетесь объединить его с _X_. Вот почему 'is/2' и' =: = '(арифметическое равенство) могут иметь разные ответы с теми же аргументами. –

0

Будет зависеть от версии Prolog; например, CPRO (неудивительно) написано на C, поэтому все встроенные предикаты реализованы на императивном языке.

0

Пролог был разработан для анализа языка. Таким образом, арифметическое выражение, как

3 + - (4 * 12)/2 + 7 

после разбора только пролог термина (представляющего дерево синтаксического анализа), с operator/3 обеспечивая семантику для руководства работы парсера. Для основных арифметических выражений используются следующие условия:

  • '-'/2. Отрицание
  • '*'/2, '/'/2. Умножение, деление
  • '+'/2, '-'/2. Сложение, вычитание

Образец выражение выше анализируется как

'+'('+'(3 , '/'('-'('*'(4,12)) , 2)) , 7) 

'is'/2 просто делает рекурсивный ходьбы от синтаксического дерева, представляющий правую руку, оценивая каждый член в значительной степени так же, как RPN (обратный полировка нотация) калькулятор. Как только это выражение оценивается, результат унифицирован с левой стороны.

Каждое базовое операция — сложение, вычитание, умножение, деление и т.д. — должно быть сделано в машинном коде, так что в конце концов, некоторая машинный код рутина быть вызвана для вычисления результата каждой элементарной операции ,

Будь то is/2 написан полностью в собственном коде или написан в основном в прологе, с помощью только операций листа, написанных в собственном коде, в значительной степени является выбором реализации.

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

  • Нет связанных вопросов^_^