#prolog #metaprogramming
#пролог #метапрограммирование
Вопрос:
Я готовлюсь к экзамену и застрял на одном из подготовительных вопросов:
Вопрос:
Следующая пролог-программа является метапрограммой. Объясните, почему эта программа является метапрограммой, и дайте ответ на три вопроса программе.:
?- prove(moving_method(bird,M),N).
?- prove(moving_method(ross,M),N).
?- prove(moving_method(kim,M),N).
Я пытаюсь запустить код (на swish.swi-prolog.org ) но это дает мне только это сообщение об ошибке:
Sandbox restriction!
Could not derive which predicate may be called from
call(C)
prove(A,B)
prove(moving_method(bird,A),B)
Код, который нам дан:
:- dynamic moving_method/2, is_a/2.
is_a(bird,animal).
is_a(ross,albatross).
is_a(kim,kiwi).
is_a(albatross,bird).
moving_method(bird,fly).
moving_method(kiwi,walk).
prove(Fact,l):-
Fact,!.
prove(Fact,X):-
Fact=..[Rel,A1,A2],
is_a(A1,SA),
NewFact=..[Rel,SA,A2],
prove(NewFact,X1),
X is X1 1.
Сообщение об ошибке может быть довольно простым, но как мне это исправить? И почему это метапрограмма?
Спасибо!
Комментарии:
1. Вы пробовали это на своем локальном компьютере с помощью swi prolog? В SWISH отключено множество функций — я думаю, из-за проблем с сохранением.
2. Представляет интерес: SWI-Prolog sandbox.pl
3. Как отмечает @DuDa, не используйте SWISH для вызовов, основанных на переменных, например
Fact
. Вместо этого запустите его при локальной установке, где ограничения изолированной среды не применяются.4. Установил его на моем компьютере и попытался запустить его снова, что сделало свое дело. Спасибо!
Ответ №1:
почему это метапрограмма?
См.: SWI-Предикаты мета-вызовов Prolog
Предикаты мета-вызова используются для вызова терминов, созданных во время выполнения.
В этом случае передаем предикат для вызова, Fact
, затем запускаем его как цель.
Комментарии:
1. Хорошо, отлично, спасибо!