Prolog 谓词以查找术语中出现的子项
执行查询时,N的值由2变为1: 出现次数(X,s(X,t(X,Y)),N)。 N=1 出现次数(子项、术语、R):-出现次数(子项、术语、0、R)。 事件(Sub,Sub,Acc,R):-R是Acc+1。 事件(子,项,Acc,R):-函子(项,N),事件(N,子,项,Acc,R)。 事件(N,Sub,Term,Acc,R4):-N>0,arg(N,Term,R),事件(Sub,R,Acc,R2), N1是N-1,出现次数(N1,子,项,R2,R4)。 事件(N,,,Acc,Acc):-N<1。Prolog 谓词以查找术语中出现的子项,prolog,Prolog,执行查询时,N的值由2变为1: 出现次数(X,s(X,t(X,Y)),N)。 N=1 出现次数(子项、术语、R):-出现次数(子项、术语、0、R)。 事件(Sub,Sub,Acc,R):-R是Acc+1。 事件(子,项,Acc,R):-函子(项,N),事件(N,子,项,Acc,R)。 事件(N,Sub,Term,Acc,R4):-N>0,arg(N,Term,R),事件(Sub,R,Acc,R2), N1是N-1,出现次数(N1,子,项,R2,R4)。 事件(N,,,Acc,Acc):-N
您已经在代码中找到了正确的位置。现在你只需要把它复制到最后 有关许可证和版权信息,请参见文件顶部
您已经在代码中找到了正确的位置。现在你只需要把它复制到最后 有关许可证和版权信息,请参见文件顶部
occurrences(Sub,Term,R) :- occurrences(Sub,Term,0,R).
occurrences(Sub,Sub,Acc,R) :- R is Acc + 1.
occurrences(Sub,Term,Acc,R) :- functor(Term,_,N),occurrences(N,Sub,Term,Acc,R).
occurrences(N,Sub,Term,Acc,R4) :- N > 0, arg(N,Term,R), occurrences(Sub,R,Acc,R2),
N1 is N-1, occurrences(N1,Sub,Term,R2,R4).
occurrences(N,_,_,Acc,Acc) :- N < 1.
occurrences_of_term(Sub, Term, Count) :-
count(sub_term(Sub, Term), Count).
%! occurrences_of_var(+SubTerm, +Term, ?Count)
%
% Count the number of SubTerms in Term
occurrences_of_var(Sub, Term, Count) :-
count(sub_var(Sub, Term), Count).
%! sub_term(-Sub, +Term)
%
% Generates (on backtracking) all subterms of Term.
sub_term(X, X).
sub_term(X, Term) :-
compound(Term),
arg(_, Term, Arg),
sub_term(X, Arg).
%! sub_var(-Sub, +Term)
%
% Generates (on backtracking) all subterms (==) of Term.
sub_var(X0, X1) :-
X0 == X1.
sub_var(X, Term) :-
compound(Term),
arg(_, Term, Arg),
sub_var(X, Arg).
/*******************************
* UTIL *
*******************************/
%! count(:Goal, -Count)
%
% Count number of times Goal succeeds.
:- meta_predicate count(0,-).
count(Goal, Count) :-
State = count(0),
( Goal,
arg(1, State, N0),
N is N0 + 1,
nb_setarg(1, State, N),
fail
; arg(1, State, Count)
).