ошибка при компиляции метапрограммы в прологе - PullRequest
3 голосов
/ 18 февраля 2012

Я пытаюсь реализовать метапрограмму в ECLiPSe Prolog, и вот код, который я написал -

:- 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), и она прерывается. Я попытался очистить все модули верхнего уровня и заново открыть ECLiPSe, а затем запустить, но ошибка все та же.

В чем может быть причина?

Спасибо!

1 Ответ

3 голосов
/ 19 февраля 2012

Предикат 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)).

.

Если вы хотите, чтобы мета-интерпретатор охватывал весь язык Prolog, вам придется явно обрабатывать все управляющие конструкции,Вот они - как определено в стандарте (7.8 Управляющие конструкции).

  1. true/0
  2. fail/0
  3. call/1
  4. !/0
  5. (',')/2
  6. (;)/2 - дизъюнкция
  7. (->)/2
  8. (;)/2 - if-then-else
  9. catch/3
  10. throw/1

Помните, что только некоторые из них могут быть обработаны путем прямого вызова цели.Большинство из них должны быть обработаны явно!

...