Poplog 15.5 (Prolog)
Версия реализации Poplog (Prolog) языка программирования PrologВерсия Poplog.
Примеры:
Hello, World! - Prolog (97):
Этот пример не требует загрузки фактов или правил. Запрос выполняется в интерактивном режиме, и его результат выглядит следующим образом:
Hello, World!
yes
Первая строка является собственно выводом предиката write
, вторая — результат оценивания запроса.
Следует отметить, что замена одинарных кавычек на двойные выводит строку как массив ASCII-кодов отдельных символов:
| ?- write("Hello, World!").
[72,101,108,108,111,44,32,87,111,114,108,100,33]
yes
write('Hello, World!'), nl.
Числа Фибоначчи - Prolog (98):
Простая рекурсивная реализация слишком неэффективна с точки зрения памяти, чтобы успешно выполняться в Poplog, поэтому этот пример демонстрирует более сложную технику — рекурсию с запоминанием. Дополнительный предикат memo(Goal)
определяется так, что в первый раз, когда оценивается Goal
, результат оценки добавляется в базу фактов, и при следующем запросе не переоценивается, а используется как известный факт.
После этого предикат fib(N,F)
определяется рекурсивно, но каждый вызов fib
“обернут” в предикат memo
, поэтому для каждого значения N fib(N,F)
оценивается только один раз. При таком подходе печать вычисленных чисел может производиться сразу после их вычисления, без дополнительного цикла.
% fibonacci.pl
:- dynamic(stored/1).
memo(Goal) :-
stored(Goal) -> true;
Goal, assertz(stored(Goal)).
fib(1,1) :- !, write('1, ').
fib(2,1) :- !, write('1, ').
fib(N,F) :-
N1 is N-1, memo(fib(N1,F1)),
N2 is N-2, memo(fib(N2,F2)),
F is F1 + F2,
write(F), write(', ').
% interactive
[-fibonacci].
fib(16,X), write('...'), nl.
Факториал - Prolog (99):
Этот пример состоит из двух частей — первую часть кода следует сохранить в файле fact.pl
, расположенном в рабочем каталоге Poplog, а вторую — ввести вручную в интерактивном режиме.
[-fact].
загружает базу фактов и правил из этого файла в текущую сессию Poplog (и выводит сообщение fact reconsulted
, чтобы обозначить успешность загрузки). Запрос fact(16,X).
пытается найти значение X, при котором этот предикат будет оценен как истинный. Вывод, требующийся в примере, будет побочным эффектом оценивания запроса, а основным результатом будет X = 20922789888000 ?
. Это означает, что если вы недовольны такой привязкой переменных, вы можете отказаться от нее (введя ; ), и будет продолжен поиск лучшей привязки.
% fact.pl
fact(X, F) :-
( X=0, F=1;
Y is X-1, fact(Y, Z), F is X*Z),
write(X), write('! = '), write(F), nl.
% interactive
[-fact].
fact(16,X).
Комментарии
]]>blog comments powered by Disqus
]]>