-1

LがリストではないRのすべての用語を含むリストである場合にのみ成功する述語f(L、R)を作成する必要があります。例えば:

f(L,[1,2,3,[4,5,6],[[7,8,9]],[]]).

与える必要があります:

L = [1,2,3,4,5,6,7,8,9]

代わりに次の結果を与える述語を書きました。

L = [1,2,3,4,5,6,7,8,9,[]]

結果に空のリストが表示されないようにする必要があります。私の述語は次のとおりです。

f([],[]).
f(V,[H|T]):-  H = [_|_] -> append(L,R,V),
              f(L,H),  f(R,T),!;
              V = [H1|T1], H1=H, f(T1,T).

私には2つの疑問があります。まず第一に、空のリストが結果に含まれるべきではありません。また、カットを入れないとどうして動かないのかわかりません(!)。実際、カットを入れないと上記のような結果になりますが、別の結果を求めると永久にループします。なぜこれがループするのか本当にわかりません。

4

1 に答える 1

1

空のリストを削除するには、そのケースを処理します(破棄します)。

ループについて:原因は、すべての引数がインスタンス化されていない状態でappend(L、R、V)を呼び出していることが原因である可能性があります。再帰呼び出しの後にappendを移動します。

最後に、「if thenelse」構文を正しく使用しない可能性があります。通常のSWI-Prologソーススタイルを使用してインデントし、インデントを使用して「シーケンシャル」呼び出しを強調表示しました

f([], []).
f(V, [H|T]) :-
    (   H = []      % if H = []
    ->  f(V, T)     %  then discard
    ;   H = [_|_]   % else if H is list
    ->  f(L,H),     %  flat head
        f(R,T),     %  ...
        append(L,R,V)
    ;   V = [H|T1], % else 
        f(T1,T)     %  ...
    ).
于 2012-11-23T22:55:14.537 に答える