Синтаксис Пролога
Синтаксис немного отключен: обычно у предложения есть заголовок, подобный foo(X, Y, Z)
, затем стрелка (:-
), за которой следует тело.Это тело обычно не содержит стрелок :-
.Поэтому вторая стрелка :-
не имеет особого смысла.
Предикаты и объединение
Во-вторых, в предикатах Пролога нет входных или выходных данных , aпредикат - true
или false
(ну, он также может ошибаться или застревать в бесконечном цикле, но это типичное поведение, которое мы хотим избежать).Он передает ответы с помощью , объединяющих переменных.Например, звонок sameSeqDiffs([3, 5, 7, 9], X)
.может преуспеть, объединив X
с 2
, и тогда предикат - при условии, что он реализован правильно - вернет true.
.
Индуктивные определения
ВДля разработки предиката, как правило, в первую очередь ставится задача создать индуктивное определение : определение, состоящее из одного или нескольких базовых случаев и одного или нескольких «рекурсивных» случаев (где предикат определенчастями самого себя).
Например, здесь мы можем сказать:
(базовый случай) Для списка из ровно двух элементов [X, Y]
,Предикат sameSeqDiffs([X, Y], D)
выполняется, учитывая, что D
- это разница между Y
и X
.
В Прологе это будет выглядеть следующим образом:
sameSeqDiffs([X, Y], D) :-
___.
(с___
заполняется).
Теперь для индуктивного случая мы можем определить sameSeqDiffs/2
в терминах самого себя, хотя не с теми же параметрами, конечно.В математике иногда определяют функцию f , например, f (i) = 2 × f (i-1) ;например, f (0) = 1 в качестве базы.Аналогичным образом можно определить индуктивный регистр для sameSeqDiffs/2
:
(индуктивный регистр) Для списка из более чем двух элементов все элементы в списке имеютта же разница, учитывая, что первые два элемента имеют разницу D
, а в списке элементов, кроме первого, все элементы также имеют эту разницу D
.
В Прологе это будетвыглядят так:
sameSeqDiffs([X, Y, Z|T], D) :-
___,
sameSeqDiffs(___, ___).
Арифметика в Прологе
Распространенная ошибка, которую люди, начинающие программировать на Прологе, заключаются в том, что они думают, что, как это принято во многих языках программирования, Пролог добавляет семантику к определеннымфункторы.
Например, можно подумать, что A - 1
будет уменьшать A
.Для Пролога это, однако, всего лишь -(A, 1)
, это не минус или что-то еще, просто функтор.В результате Prolog будет не оценивать такие выражения.Итак, если вы напишите X = A - 1
, тогда X
будет просто X = -(A,1)
.
Тогда как мы можем выполнять числовые операции?Системы Prolog имеют предикат is/2
, который оценивает правую часть, добавляя семантику к правой стороне.Таким образом, предикат is/2
будет интерпретировать функторы (+)/2
, (-)/2
и т. Д. ((+)/2
как плюс, (-)/2
как минус и т. Д.).
Итакмы можем оценить выражение как:
A = 4, is(X, A - 1).
и тогда X
будет установлено в 3
, , а не 4-1
.Пролог также позволяет записывать инфикс is
, например:
A = 4, X is A - 1.
Здесь вам понадобится вычислить разницу между двумя элементами.