Ошибка при соблюдении метапрограммы в прологе

StackOverflow https://stackoverflow.com/questions/9342460

  •  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 управляющие конструкции).

  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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top