Не удалось определить, какой предикат может быть вызван

#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. Хорошо, отлично, спасибо!