Изучая курс логического программирования на языке Prolog в среде Arity Prolog, кто-то наверняка задавался вопросом, можно ли программировать на Prolog в UNIX. Ответ — да, можно. Для этого очень хорошо подходит пакет SWI-Prolog, хороший тем, что все примеры из лекций, данные для Arity Prolog, без проблем работают в SWI-Prolog (иногда с небольшими изменениями).
Для создания файла с исходным текстом можно использовать любой текстовый редактор. Сохранив файл с именем, к примеру, foo.ari, вы можете запустить его исполнение при помощи команды:
swipl -s foo.ari
Пример исходного файла (написать предикат digits/2, вычисляющий количество чётных цифр в натуральном числе, заданном первым аргументом, помещающий результат во второй аргумент):
digits(0, 0):-!. digits(X, S):- Tail is X div 10, Residue is ((X mod 10) mod 2), ( (Residue = 0, digits(Tail, P), S is 1 + P); (Residue = 1, digits(Tail, S)) ).
Пример сеанса работы:
?- digits(123456, X). X = 3 ; false. ?- digits(X, 4). ERROR: is/2: Arguments are not sufficiently instantiated
Ради любопытства можно попробовать переписать то же самое на erlang. Ограничимся одним аргументом, так как здесь у нас есть возможность возвращать значения, отличные от логических.
-module('digits').
-export([digits/1]).
digits(0) -> 0;
digits(X) ->
case ((X rem 10) rem 2) of
0 -> digits(X div 10) + 1;
1 -> digits(X div 10)
end.
Развлекаемся аналогичным образом.
1> c(digits).
{ok,digits}
2> digits:digits(0).
0
3> digits:digits(123456).
3
4>
В обоих примерах можно ещё попробовать сделать рекурсию правосторонней (хвостовой), но нужно ли?
Смотрите также сообщение в блоге о Windows-версии SWI-Prolog.
