Prolog 谓词以查找术语中出现的子项

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

执行查询时,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。
您已经在代码中找到了正确的位置。现在你只需要把它复制到最后

有关许可证和版权信息,请参见文件顶部


您已经在代码中找到了正确的位置。现在你只需要把它复制到最后

有关许可证和版权信息,请参见文件顶部

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