Search code examples
prologmetaprogramming

Could not derive which predicate may be called


I'm studying for an exam and got stuck on one of the prep questions:

Question:

The following Prolog-program is a meta-program. Explain why this program is a meta-program and give the output to the three questions to the program:

?- prove(moving_method(bird,M),N). 
?- prove(moving_method(ross,M),N).
?- prove(moving_method(kim,M),N).

I'm trying to run the code(on swish.swi-prolog.org) but it only gives me this error message:

Sandbox restriction! 
Could not derive which predicate may be called from
      call(C)
      prove(A,B)
      prove(moving_method(bird,A),B)

The code we are given:

:- 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.

The error message might be fairly straight forward but how do I fix it? And why is this a meta-program?

Thank you!


Solution

  • why is this a meta-program?

    See: SWI-Prolog Meta-Call Predicates

    Meta-call predicates are used to call terms constructed at run time.

    In this case passing in the predicate to call, Fact, then running it as a goal.