SWI-Prolog
Реализация языка программирования PrologSWI-Prolog — это мощная среда разработки с набором графических инструментов ХРСЕ. Ядро системы лицензировано под GNU LGPL, библиотеки — под GNU GPL с дополнительным условием, позволяющим использование в проприетарных приложениях. Развитие SWI-Prolog началось в 1987 г., и сегодня он широко используется в исследовательских и образовательных целях, а также в коммерческих приложениях.
SWI Prolog — довольно популярная система, в основном благодаря удобной среде и переносимой библиотеке для создания графического интерфейса. SWI-Prolog, как почти все реализации языка, по большей части реализует Edinburgh Prolog, но также содержит отдельные элементы ISO Prolog.
SWI-Prolog включает в себя быстрый компилятор, профилировщик, набор библиотек и удобный интерфейс для подключения C-модулей. Он реализован для ряда UNIX-платформ, таких, как HP, IBM Linux, для NeXT, OS/2, Sun и Sparc.
Prolog XREF
Логотип SWI-Prolog
Примеры:
Hello, World!:
Пример для версий B-Prolog 7.4-3, ECLiPSe CLP 6.0 #188, Poplog 15.5 (Prolog), gprolog 1.3.0, swipl 5.6.xЭтот пример не требует загрузки фактов или правил. Запрос выполняется в интерактивном режиме, и его результат выглядит следующим образом:
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.
Квадратное уравнение:
Пример для версий B-Prolog 7.4-3, gprolog 1.3.0, swipl 5.6.xЭтот пример соответствует стандарту ISO Prolog и использует встроенный предикат read/1
. Следует отметить, что при вводе термов этим способом после каждого терма следует ставить точку.
q :- write('A = '),
read(A),
( A = 0, write('Not a quadratic equation');
write('B = '),
read(B),
write('C = '),
read(C),
D is B*B-4*A*C,
( D = 0, write('x = '), X is -B/2/A, write(X);
D > 0, write('x1 = '), X1 is (-B+sqrt(D))/2/A, write(X1), nl, write('x2 = '), X2 is (-B-sqrt(D))/2/A, write(X2);
R is -B/2/A, I is abs(sqrt(-D)/2/A),
write('x1 = ('), write(R), write(', '), write(I), write(')'), nl,
write('x1 = ('), write(R), write(', -'), write(I), write(')')
)
).
Факториал:
Пример для версий B-Prolog 7.4-3, gprolog 1.3.0, swipl 5.6.xКак в GNU Prolog, так и в B-Prolog 12! не помещается в целочисленный тип данных, поэтому все значения после 11! неправильны. В SWI-Prolog переполнения не возникает.
| ?- [fact].
Результат для GNU Prolog:
compiling /home/nickolas/Desktop/progopedia/prolog/fact.pl for byte code…
/home/nickolas/Desktop/progopedia/prolog/fact.pl compiled, 3 lines read — 1372 bytes written, 5 ms
Результат для B-Prolog:
consulting::fact.pl
`| ?- fact(16,X).
0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
11! = 39916800
12! = -57869312
13! = -215430144
14! = 205203456
15! = -143173632
16! = -143294464
X = -143294464 ?`
% 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).
Числа Фибоначчи:
Пример для версий B-Prolog 7.4-3, gprolog 1.3.0, swipl 5.6.xПример почти идентичен примеру для Poplog Prolog, за исключением синтаксиса подключения файла.
% 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.
Комментарии
]]>blog comments powered by Disqus
]]>