3

私は2つのセットを受け入れ、それらの共通部分を返す関数に取り組んでいます。ただし、コードでメンバー関数を使用したくありません。これがメンバー関数です:

member( X, [ X | T ] ).
member( X, [ _ | T ] ) :- member( X, T ).

これが私がこれまでに持っているものです:

     set_int(_,[],_).   
     set_int([H|T],[H|T1],[H|T2]) :-
           set_int(T,T1,T2).
     set_int(T,[X|T1],T2) :-
           set_int(T,T1,T2). 

私の論理を手伝ってください。

4

2 に答える 2

1

set_int最初の用語の3つのケース(空のリスト、1つの要素のリスト、およびそれより長いリスト)を処理するように作成するset_int( [A], B, [A] )と、の代わりに効果的に使用できますmember( A, B )

于 2012-12-19T01:02:43.067 に答える
0

セットを注文した場合にのみ、メンバー(または同等のもの)を処分できると思います。そのような仮定で、私たちは頭だけを比較することができます:

set_int([X|Xs], [Y|Ys], Is) :-
    X @< Y,
    !, set_int(Xs, [Y|Ys], Is).
set_int([X|Xs], [Y|Ys], Is) :-
    X @> Y,
    !, set_int([X|Xs], Ys, Is).
set_int([Z|Xs], [Z|Ys], [Z|Is]) :-
    !, set_int(Xs, Ys, Is).
set_int(_, _, []).
于 2012-12-19T07:01:45.290 に答える