2

別の問題、削除するための適切な「機能」があります。

remove([],X,[]) :- !. 
remove([X|T],X,L1) :- !, remove(T,X,L1).         
remove([H|T],X,[H|L1]) :- remove(T,X,L1). 

しかし、それは私がそれを機能させたいようには機能しません。要素またはリストさえも削除します...

...しかし、すべての外観を削除するわけではありません。これが目標です:

remove([A,B,[C],[A,[B]],[[A,[B]]]],[A,[B]],X).
X=[A,B,[C],[]]

何か案は?

4

1 に答える 1

5

たとえば remove([1,2,3,1],1,X) に X=[2,3] を計算させるなど、すべての外観を削除したい場合は、2 番目の節を次のように置き換えます。

 remove([X|T],X,L1) :- remove(T,X,L1), !.  

ただし、a) 変数として保持する必要がある変数を操作し、b) サブリストからリストを削除したいようです。

まず、b) の問題を解決することから始めます。

remove([],_,[]) :- !. 
remove(A,_,A) :- \+ (A = [_|_]), !.
remove([X|T],X,L1) :- remove(T,X,L1), !.        
remove([H|T],X,[G|L1]) :- remove(H,X,G), remove(T,X,L1).

ご覧のとおり、最後の節に 2 回目の再帰呼び出しを追加して、内部リストを処理します。さらに、最初の引数は必ずしもリストではないため、特殊なケース (2 番目の句) を追加する必要がありました。

最後に、a) を解決するには、Sterling と Shapiro の "freeze" / "melt" 述語を使用する必要があります。freeze は変数を式 #VAR(0)、#VAR(1)、... に置き換え、melt はその逆を行います。Melt は従来から Melt_new として知られています。

numvars('#VAR'(N),N,N1) :- N1 is N+1.
numvars(Term,N1,N2) :- nonvar(Term), functor(Term,_,N),
                          numvars(0,N,Term,N1,N2).

numvars(N,N,_,N1,N1).
numvars(I,N,Term,N1,N3) :- I<N, I1 is I+1,
          arg(I1,Term,Arg), numvars(Arg,N1,N2),
          numvars(I1,N,Term,N2,N3).

frz(A,B) :- frz(A,B,0).
frz(A,B,Min) :- copy_term(A,B), numvars(B,Min,_),!.


melt_new(A,B) :-
   melt(A,B,Dictionary), !.

melt('$VAR'(N),X,Dictionary) :-
    lookup(N,Dictionary,X).
melt(X,X,Dictionary) :-
    constant(X).
melt(X,Y,Dictionary) :-
    compound(X),
    functor(X,F,N),
    functor(Y,F,N),
    melt(N,X,Y,Dictionary).

melt(N,X,Y,Dictionary) :-
    N > 0, 
    arg(N,X,ArgX), 
    melt(ArgX,ArgY,Dictionary),
    arg(N,Y,ArgY), 
    N1 is N-1, 
    melt(N1,X,Y,Dictionary).
melt(0,X,Y,Dictionary).

/*  
    lookup(Key,Dictionary,Value) :-
    Dictionary contains the value indexed under Key.
    Dictionary is represented as an ordered binary tree.

*/

    lookup(Key,dict(Key,X,Left,Right),Value) :-
        !, X = Value.
    lookup(Key,dict(Key1,X,Left,Right),Value) :-
        Key < Key1 , lookup(Key,Left,Value).
    lookup(Key,dict(Key1,X,Left,Right),Value) :-
        Key > Key1, lookup(Key,Right,Value).

ところで、私はスターリングとシャピロの本「The Art of Prolog」を強くお勧めします。融解と凍結については、第 15 章で説明します。

于 2012-04-08T22:27:35.143 に答える