无权访问 private_procedure `true/0'
No permission to access private_procedure `true/0'
我正在尝试将原始元解释器与 'if' 和 'and' 一起使用。
这是我的代码:-
:- 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
但是当第二个条件为假时 return 错误 没有权限访问 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'
请帮忙,谢谢。
该错误是由于尝试对内置谓词调用 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).
我正在尝试将原始元解释器与 'if' 和 'and' 一起使用。
这是我的代码:-
:- 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
但是当第二个条件为假时 return 错误 没有权限访问 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'
请帮忙,谢谢。
该错误是由于尝试对内置谓词调用 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).