Нет прав доступа к private_procedure `true / 0 ' - PullRequest
2 голосов
/ 12 апреля 2020

Я пытаюсь использовать ванильный мета-интерпретатор с 'if' и 'и'.

Вот мой код: -

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

, когда оба условия верны.

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

когда первое условие ложно.

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

но когда второе условие ложно, возвращается ошибка Нет разрешения на доступ к 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'

пожалуйста, помогите, спасибо.

1 Ответ

2 голосов
/ 12 апреля 2020

Ошибка возникает при попытке вызвать предикат clause/2 для встроенных предикатов. Минимальным исправлением будет изменение первого предложения вашего мета-интерпретатора:

prove(true) :- !.

Это позволит избежать возврата к цели prove(true), чтобы попытаться использовать последнее предложение мета-интерпретатора, в результате чего ошибка. Более общее исправление заключается в добавлении следующего предложения:

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

Т.е.

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).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...