Pilog (Lisp&Prolog)

Sergey ShishkinSergey Shishkin
2 min read

На основе PicoLisp построен декларативный язык, обладающий семантикой Prolog, но использующий синтаксис Lisp. Факты и правила могут быть объявлены с помощью be функции. Как и в Прологе, разница между фактами и правилами заключается в том, что последние имеют условия и обычно содержат переменные. Переменная в Pilog — это любой символ, начинающийся с символа at-метки (" @"), т. е. pat? символ. Сам символ @ может использоваться как анонимная переменная: он будет соответствовать во время унификации, но не будет привязан к сопоставленным значениям. Оператор cut Пролога (обычно обозначаемый восклицательным знаком (!) является символом T в Pilog. Интерактивный запрос можно выполнить с помощью ? функции. Pilog можно вызвать из Lisp и наоборот:

  • Интерфейс из Lisp осуществляется через функции goal (подготовка запроса из данных Lisp) и prove(возвращение списка ассоциаций успешных привязок), а также функции уровня приложения pilog и solve.

  • Если CAR предложения Pilog является символом ^, то CDDR выполняется как prgтело Lisp, а результат объединяется с CADR.

  • В таком выражении Lisp в предложении Pilog текущие привязки переменных Pilog доступны напрямую в соответствующих привязках символов Lisp или могут быть доступны с помощью -> функции (последняя необходима только для доступа к средам Pilog не верхнего уровня).

Как видим, существует функция уровня приложения - pilog, оценивающая запрос Pilog и выполняет prg для каждого набора результатов, при этом все переменные Pilog привязаны к соответствующим значениям.

(pilog 'lst . prg) -> any

: (pilog '((append @X @Y (a b c))) (println @X '- @Y))
NIL - (a b c)
(a) - (b c)
(a b) - (c)
(a b c) - NIL
-> NIL

Более того, функции, реализующие концепцию классиицированы отдельным списком - prove -> unify be clause repeat asserta assertz retract rules goal fail pilog solve query ? repeat/0 fail/0 true/0 not/1 call/1 or/2 nil/1 equal/2 different/2 append/3 member/2 delete/3 permute/2 uniq/2 asserta/1 assertz/1 retract/1 clause/2 show/1 for/2 for/3 for/4 db/3 db/4 db/5 val/3 lst/3 map/3 isa/2 same/3 bool/3 range/3 head/3 fold/3 part/3 tolr/3 select/3 remote/2.

Обычно Pilog используется либо интерактивно для запросов к базе данных во время отладки, либо в приложениях для генерации экспортных данных и отчетов. Весь доступ Pilog к внешним символам осуществляется через два предиката db/3 и select/3

https://picolisp.com/wiki/?tutpilog

P.S. Ссылки на функции в списке есть по ссылке функции pilog. Обычно такие списки просто копирую как есть, со ссылками, но местный софт иногда глючит при редакции ссылок, что случилось и при создании этого поста, поэтому бороться с ним не стал, а просто сделал без ссылок.

0
Subscribe to my newsletter

Read articles from Sergey Shishkin directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Sergey Shishkin
Sergey Shishkin

Всегда чему-то учусь!