2012-03-11 5 views
2

私はリスト構造を必要とするProlog(eclipse)のシナリオに取り組んでいます。プロローグ内のリストの中にカンマをプラス演算子で置き換えたリストを平滑化

私は、フォームのリストを持っている:

MyList = [a,b,c]. 

私は+演算子と置き換え、すべてのコンマを持つ単一の要素にリストを平らにできるかどうかを確認しようとしていました。

だから私の結果リストは次のようになります。単一要素リストである

ResultList = [a+b+c] 

。最初のリストの長さは任意です。

プロローグはこのような操作には適していませんが、これは可能ですか?

答えて

4

です。私は、Eclipseとは差があってはならないと思う:

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

編集:偽

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). 
+0

ありがとうございます。ちょうど私が探していたもの。 – kallakafar

+0

申し訳ありませんが、バグを発見しました。編集 – CapelliC

+0

@chac 'list_to_op([3]、Op)'が失敗しました。意図されました? – false

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). 

出力はあなたが望んでいたものとは若干異なっているに役立つことがあります。現在、標準のPrologでは、[a +(b + c)]

+0

私はこの数ヶ月間前のカップルを書いて使用したものとほぼ同じです(述語名と引数名は別です)。 +は中置演算子なので、** flatten_list_inner/2 **からの複合項が書かれると、それらの厄介な括弧が現れます。しかし、そのような用語は、** is/2 **(原子a、b、cが数字に置き換えられている場合)によって評価することができます。 – hardmath

0

どのようにこの非再帰バージョンについて..

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


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

は編集:これはSWIをプロローグで動作します..ありませんEclipseについて確かめてください。

関連する問題