3

[#,d,e,#,f,g]出力が のように[[d,e],[f,g]]リストをフィルタリングする必要があります
。「#」に遭遇するたびに新しいリストを作成しているときにスタックします。これを行う方法はありますか? 以下のコードを試してみましたが、

filterL([],List) :-[].
filterL([Head|Tail],X) :-
   (  Head \='#'->
      append(X,Head,List),
      filterL(Tail,List)
   ;  filterL(Tail,X)
   ).
4

3 に答える 3

4

あなたの問題はあまり明確に定義されていません。空のシーケンスは許可されますか? (前後[#][[],[]]空のシーケンスがある) または[]? あなたはそうあるべきだと言います[]。そう:

list_splitbyhash(Xs, Xss) :-
   phrase(splitby(Xss,#), Xs).

splitby([],_E) -->
    [].
splitby(Xss,E) -->
    [E],
    splitby(Xss,E).
splitby([Xs|Xss],E) -->
    {Xs = [_|_]},
    all_seq(dif(E),Xs),
    splitby(Xss,E).

all_seq(_, []) --> [].
all_seq(C_1, [C|Cs]) -->
   [C],
   {call(C_1,C)},
   all_seq(C_1, Cs).
于 2014-10-18T12:11:26.347 に答える
3

これは、さらに一般的なアプローチを使用する別のバージョンです。

list_splitbyhash(Xs, Xss) :-
   phrase(by_split(=(#), Xss), Xs).

=(X,X,true).
=(X,Y,false) :- dif(X,Y).

by_split(_C_2, []) --> [].
by_split(C_2, Xss) -->
   [E],
   {call(C_2,E,T)},
   (  { T = true },
      by_split(C_2, Xss)
   |  { T = false, Xss = [[E|Xs]|Xss1] },
      all_seq(callfalse(C_2),Xs),
      el_or_nothing(C_2),
      by_split(C_2, Xss1)
   ).

callfalse(C_2,E) :-
   call(C_2,E,false).

el_or_nothing(_) -->
   call(nil).
el_or_nothing(C_2), [E] -->
   [E],
   {call(C_2,E,true)}.

nil([], []).

lambdasを使用すると、これをよりコンパクトに表現できます。それ以外の

   all_seq(callfalse(C_2),Xs)

と の定義はcallfalse/3、次のように書くことができます。

   all_seq(C_2+\F^call(C_2,F,false))
于 2014-10-18T12:36:34.593 に答える
2

メタ述語splitlistIf/3と具体化された等価述語を使用すると、目前(=)/3のタスクはワンライナーになります。これは、効率的で論理的に純粋です。

?- splitlistIf(=(#),[#,d,e,#,f,g],Xs).
Xs = [[d,e],[f,g]].                      % succeeds deterministically

コードは単調であるため、非常に一般的なクエリでも論理的な健全性が保証されます。

?- Xs = [A,B,C], splitlistIf(=(X),Xs,Yss).
Xs = [A,B,C],     X=A ,     X=B ,     X=C , Yss = [       ] ;
Xs = [A,B,C],     X=A ,     X=B , dif(X,C), Yss = [    [C]] ;
Xs = [A,B,C],     X=A , dif(X,B),     X=C , Yss = [  [B]  ] ;
Xs = [A,B,C],     X=A , dif(X,B), dif(X,C), Yss = [  [B,C]] ;
Xs = [A,B,C], dif(X,A),     X=B ,     X=C , Yss = [[A]    ] ;
Xs = [A,B,C], dif(X,A),     X=B , dif(X,C), Yss = [[A],[C]] ;
Xs = [A,B,C], dif(X,A), dif(X,B),     X=C , Yss = [[A,B]  ] ;
Xs = [A,B,C], dif(X,A), dif(X,B), dif(X,C), Yss = [[A,B,C]].
于 2015-05-15T17:08:31.810 に答える