Ошибка при соблюдении метапрограммы в прологе
-
27-10-2019 - |
Вопрос
Я пытаюсь внедрить метапрограмму в Prolog Eclipse, и вот код, который я написал -
:- dynamic go/1.
sol(true):- !.
sol((A,B)):- !, sol(A), sol(B).
sol(A):- clause(A, Body), sol(Body).
go(X):- X is 5.
Теперь, когда я запрашиваюсь с sol(go(X)).
, Я получаю ошибку accessing a procedure defined in another module in clause(X is 5, _292)
И это прервет. Я попытался очистить все модули Toplevel и повторно открыть Eclipse, а затем работать, но все же та же ошибка.
Что может быть причиной?
Спасибо!
Решение
Предикат p/1
использует встроенный предикат (is)/2
. Анкет Обратите внимание, что X is 5
это синтаксически более удобный способ написания is(X,5)
. Анкет Но ваш мета-интерпретер ожидает только предикатов, определенных пользователями и управляющих конструкций (',')/2
а также true/0
. Анкет Если вы хотите справиться (is)/2
Вы должны представить для этого отдельный пункт.
sol(X is Y) :- !, X is Y.
Внутри ISO Prolog, цель predicate_property(Goal,built_in)
можно использовать для проверки, если Goal
это встроенный предикат. Это работает во многих системах, таких как B, GNU, SICSTUS, SWI, XSB, YAP. Итак, вы можете написать:
sol(Bip) :- predicate_property(Bip, built_in), !, Bip.
В Eclipse этот встроенный не доступен напрямую. Вы должны загрузить библиотеку. А индекс руководства предлагает использовать библиотеку swi
или же quintus
. Анкет По какой -то (неясной) причине это не является частью библиотеки Eclipse iso
, но это ISO. Так государство
:- use_module(library(swi)).
В вашем файле (или в Toplevel) сначала.
Если вы хотите, чтобы мета-интерпретер охватил весь язык пролога, вам придется явно обработать все управляющие конструкции. Здесь они - как определено в стандарте (7.8 управляющие конструкции).
true/0
fail/0
call/1
!/0
(',')/2
(;)/2
- дизъюнкция(->)/2
(;)/2
-if-then-elsecatch/3
throw/1
Имейте в виду, что только некоторые из них могут быть обработаны, напрямую вызывая цель. Большинство из них должны быть обработаны явно!