2016-04-12 6 views
1

自分自身が(非常に単純な)問題をますます絞り込んでいます。私は、リストの最初の3つの要素を与えるlistsplit([H1,H2,H3|T], H1,H2,H3, T).リストのすべての要素に操作を行う方法

のは、私は、この操作を持っているとしましょう。私はプログラム、セル、入力リストを移動し、リストのすべての要素に(少なくとも1つの操作!!)したい。

だから私のようなものがあります:私は、私はリストを移動するためにそのように行くの例として見てきた多くのを使用していたので、私はそのコードを持っている

cells(Input, Result):- 
    cellsBody(Input, [], Result). 

cellsBody([],Result,Result). 
cellsBody([Head|Input], Acc, [Headd|Result]):- 
    listsplit(Input,H1,H2,H3,_), 
    cellsBody(Input, [OutputBody|Acc], Result). 

を。彼らは身体から頭を分離して行く。私はこれがプロローグでどのように行われているのか見当たりません。私は変数名を変更しようとしました(他の言語でもそうですが)、私は可能な限り単純に問題を解決しようとしました。

どのようにしてリストを移動し、すべての要素(私が選択した要素、先頭から先頭)に操作を行うのですか?

編集:私はarchieveしたいものの例:

私がそうで、オキソ、oxxxo、oxoxoなどの入力リストを取得します。最初の3つの要素、次に3つの要素などにルールを適用し、その間に私が返すリストにルールの結果を追加します(これがアキュムレータを使用しようとしている理由です) 。

+1

は、[メタ述語タグ]:の家族を参照してください単一要素の関係を説明し、その後、' maplistを使用/ 3 'のリストに関係を適用するuch要素。 – mat

+0

私のレベルからかなり離れて、悲しそうに。これまでのプロローグは、あらゆるツールを利用できるようにして、何かを使う方法を知らないように感じています。くそった。しかし、ちょうどその場合には、私の頭脳を包囲しようとしています。 – keont

+2

* single *要素の関係を記述することさえできない場合、* multiple *要素のより一般的な場合をどのように攻撃すると思いますか?単一の要素の関係を記述してみてください。私の推測では、このことから、あなたが説明したい関係について深刻な誤解があることがわかるでしょう。私の推測では、あなたが記述する方法で実装できる関係(「リストを移動してすべての要素に操作を加える」)ではないということです。そのような場合、あなたはそのような操作が* one *要素のように見えると言うことができますか? – mat

答えて

2

あなたはほとんどそれを持っています。あなたの述語セル/ 2をそのままにして、特別なケースについてまず考えてみましょう。リスト[][_][_,_]は3つの要素を持っていないので、これらの3つの要素について何を操作しても何もしません。それ以外の場合は、あなたが意図したことをするための再帰的なルールがあります。

listsplit/5を見ると、再帰的ルールの先頭で直接行うことができます。余分な述語は必要ありません。次に、目的とする操作の目標が1つ以上あります。例のために、3つのヘッド要素を3つ組としてパッケージングするとしましょう。もちろん、リストの末尾にはTの関係が成立する必要があります。

cellsBody([],Result,Result). 
cellsBody([_],Result,Result). 
cellsBody([_,_],Result,Result). 
cellsBody([H1,H2,H3|T], Acc, Result):- % the first 3 elements 
    Triplet=(H1,H2,H3),     % at least ONE operation with them 
    cellsBody(T, [Triplet|Acc], Result). 

照会の例:次に、あなたのコードは、そのようなものに見えるかもしれません意図する動作は、上記の例のように単純である場合はもちろん

?- cells([],Result). 
Result = [] 
    ?- cells([1],Result). 
Result = [] 
    ?- cells([1,2],Result). 
Result = [] 
    ?- cells([1,2,3],Result). 
Result = [(1,2,3)] 
    ?- cells([1,2,3,4,5,6,7],Result). 
Result = [(4,5,6),(1,2,3)] 

を、あなたは余分な目標を必要としませんあなたは再帰的な目標で直接それを行うことができます:それのための `maplist/N ':

cellsBody([H1,H2,H3|T], Acc, Result):- 
    cellsBody(T, [(H1,H2,H3)|Acc], Result). 
+0

最初のものが最初です。間違っています。私はルール(H1、H2、H3、アウトプット)を呼び出し、それをAccに入れたいと思っています。私は別のものが必要ですか?あなたは本当に正しいです、私は今、まれなケースで苦労していました。あなたは、複数の停止状態を置くことができると私に言うことを意味しますか?ハム。私はここから行こうとしています。そして、ええ、私はlistsplitを使用しない方法があることを知っていましたが、それを思い付くことはできませんでした。 – keont

+1

@keont:その場合、再帰的目標の第2引数として '[Output | Acc]'を書いてください。まれなケースとしては、実際にはまれではありません。長さ> = 3のリストを*取って最初の3つの要素を繰り返し取ると、 '[]'、 '[_]'または '[_、_]'になります。したがって、手続き的に言えば、再帰を終了するには3つのケースが必要です。 – tas

+0

ええ、これは私が今夜すべての問題を解決しようとしていたものです。デバッグしたとき、私はそうだったのですが、3種類のリストを統一するにはどうすればいいですか? 1と2の要素がひどく失敗しているのを見ました。もう一度ありがとう!!!!!!) – keont

関連する問題