2

我正在尝试将香草元解释器与“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

但是当第二个条件为假时,它返回错误没有权限访问 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'

请帮忙,谢谢。

4

1 回答 1

2

该错误是由于尝试clause/2在内置谓词上调用谓词而导致的。一个最小的解决方法是修改元解释器的第一个子句:

prove(true) :- !.

这将避免回溯prove(true)目标以尝试使用元解释器的最后一个子句,从而导致该错误。更一般的解决方法是添加以下子句:

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

IE

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).
于 2020-04-12T07:22:41.887 回答