Пролог был разработан для анализа языка. Таким образом, арифметическое выражение, как
3 + - (4 * 12)/2 + 7
после разбора только пролог термина (представляющего дерево синтаксического анализа), с operator/3
обеспечивая семантику для руководства работы парсера. Для основных арифметических выражений используются следующие условия:
'-'/2
. Отрицание
'*'/2
, '/'/2
. Умножение, деление
'+'/2
, '-'/2
. Сложение, вычитание
Образец выражение выше анализируется как
'+'('+'(3 , '/'('-'('*'(4,12)) , 2)) , 7)
'is'/2
просто делает рекурсивный ходьбы от синтаксического дерева, представляющий правую руку, оценивая каждый член в значительной степени так же, как RPN (обратный полировка нотация) калькулятор. Как только это выражение оценивается, результат унифицирован с левой стороны.
Каждое базовое операция — сложение, вычитание, умножение, деление и т.д. — должно быть сделано в машинном коде, так что в конце концов, некоторая машинный код рутина быть вызвана для вычисления результата каждой элементарной операции ,
Будь то is/2
написан полностью в собственном коде или написан в основном в прологе, с помощью только операций листа, написанных в собственном коде, в значительной степени является выбором реализации.
спасибо. И как предикат инкремента может быть реализован в Prolog (для реализации «is/2»). Я просмотрел его, но я только нашел реализации инкремента, используя 'is/2'. Я прошу все это, потому что мне любопытно, может ли Пролог быть чистым (как в, «все является предикатом»). – octavian
@octavian 'is/2' - предикат. Если вы имеете в виду, что 'is' должен работать в обоих направлениях, вы понимаете, что для общего случая это не совсем полезно (2 равно 1 + 1; 2 равно 0 + 2; 2 равно 4/2; 2 - sqrt (4); ...). Однако программирование логики ограничения приближается к тому, что вы, вероятно, имеете в виду. –
Прочитав ответ более внимательно, это не совсем правильно. Скорее всего, if/else в вашем примере для 'is/2' не требуется; вместо этого вы оцените _Expr_ и попытаетесь объединить его с _X_. Вот почему 'is/2' и' =: = '(арифметическое равенство) могут иметь разные ответы с теми же аргументами. –