Жизнь, веб, XMPP, TAS, электронные самоделки

Prolog-программирование

Изучая курс логического программирования на языке 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>

В обоих примерах можно ещё попробовать сделать рекурсию правосторонней (хвостовой), но нужно ли?