2

私はProlog(Eclipse)で、リスト構造を再フォーマットする必要があるシナリオに取り組んでいます。

フォームのリストがあります:

MyList = [a,b,c].

すべてのコンマを+演算子に置き換えて、リストを1つの要素にフラット化できるかどうかを確認しようとしていました。

したがって、私の結果リストは次のようになります。

ResultList = [a+b+c] 

これは単一要素リストです。初期リストの長さは任意です。

私はプロローグがそのような操作に適していないことを知っていますが、これはできますか?

4

3 に答える 3

4

これが、標準のPrologです。Eclipseとの違いはないはずだと思います。

list_to_op([X,Y|T], [R]) :-
    list_to_op(T, X+Y, R).

編集:falseによって指摘されたバグ

list_to_op([X], [X]).

list_to_op([X], R, R+X).
list_to_op([X|T], R, Q) :-
    list_to_op(T, R+X, Q).

テスト:

?- list_to_op([a,b,c],X).
X = [a+b+c] .

アキュムレータは、適切な連想性を与えるために必要です:より単純でより直感的な定義

list_to_op1([X], X).
list_to_op1([X|R], X+T) :-
   list_to_op1(R, T).

与える

?- list_to_op1([a,b,c],X).
X = a+ (b+c) .

評価の順序が重要な場合は、list_to_opを使用してください。

編集:バグがあります:list_to_op([a、b]、X)が失敗します。

ここでの修正は、よくあることですが、単純化したものです。

list_to_op([], R, R).
list_to_op([X|T], R, Q) :-
    list_to_op(T, R+X, Q).
于 2012-03-11T08:41:52.660 に答える
1

これは役立つかもしれません

flatten_list(A,[B]) :- flatten_list_inner(A,B).

flatten_list_inner([A],A).
flatten_list_inner([H|T],H+Y) :- flatten_list_inner(T,Y). 

出力は、希望したものとは少し異なります。現在は[a+(b + c)]です

于 2012-03-11T04:59:12.410 に答える
0

この非再帰バージョンはどうですか。

list_to_op(L, Res) :-
    concat_atom(L, '+', Atom),
    Res = [Atom].


?-  list_to_op([a,b,c], X).
X = ['a+b+c'].

編集:これはSwi-prologで機能します。Eclipseについてはよくわかりません。

于 2012-03-12T00:18:34.623 に答える