No permission to access private_procedure `true/0'

315 Views Asked by At

I am trying to use vanilla meta interpreter with 'if' and 'and'.

Here is my code:-

:- op( 600, xfy, if).
:- op( 500, xfy, and).
findnum(X,X).
findnum(X,[X|Tail]).
findnum(X,[Y|Tail]):-
   findnum(X,Tail).

prove(true).
prove((A,B)):- !,prove(A),prove(B).
prove(A and B):-
   !,prove(A),prove(B).
prove(A):-
   clause(A,B),
   prove(B).

when both condition true.

?-prove((findnum(a,[a,b,c]) and findnum(a,[a,b,c]))).
true

when first condition false.

?-prove((findnum(a,[b,b,c]) and findnum(a,[a,b,c]))).
false

but when second condition is false it return error No permission to access private_procedure `true/0'

?-prove((findnum(a,[a,b,c]) and findnum(a,[b,b,c]))).
ERROR: No permission to access private_procedure `true/0'

please help, thank you.

1

There are 1 best solutions below

0
On BEST ANSWER

The error results from trying to call the clause/2 predicate on built-in predicates. A minimal fix would be to modify the first clause of your meta-interpreter:

prove(true) :- !.

This will avoid backtracking on prove(true) goals to try to use the last clause of the meta-interpreter, resulting in that error. A more general fix is to add the following clause:

prove(A) :-
    predicate_property(A, built_in),
    !,
    call(A).

I.e.

prove((A,B)):-
    !,
    prove(A),
    prove(B).
prove(A and B):-
   !,
   prove(A),
   prove(B).
prove(A) :-
    predicate_property(A, built_in),
    !,
    call(A).
prove(A):-
   clause(A,B),
   prove(B).