2017-02-03 12 views
0

私はPrologを初めて使って、各リストの最初の要素だけを集計しようとしました。Prologリストの最初のインデックスの合計

takeFirst([[1,2,3],[4,5,6],[7,8,9]],R). --> R=1+4+7=12 

偽を出力し続け、私はここで何が欠けているのか分かりません。

takeFirst([HF|_],[],HF):-!. 
takeFirst([H|L1],R):- H=[_|_], L1=[_|_],!,takeFirst(H,L1,NN), R is NN. 
takeFirst([HF|_],[K|L2],HF):- takeFirst(K,L2,NN), HF is HF+NN. 

ここで何が間違っているのですか?

+0

与えられたリストの中の空のリストがある場合には何をすべきか? –

+1

Prologで要素を追加することはできません。 Prologは*宣言型言語です。つまり、変数の割り当て時に変数を変更することはできません。 –

+0

私は誤って「追加する」と言っていましたが、すべてのリストの最初の要素のリストを返しています。この場合、私が言ったように '[1,4,7]'を返します。 Imは基本的に私がそれに先立っていくつかの問題を抱えていたので、 'RbはRa + HH'を 'Rb = [Ra、HH]'に置き換えることができるかどうかを尋ねています – mooly

答えて

1

あなたのコードはむしろ混乱しています。takeFirst/3を最初に定義します(おそらくベースケースにする必要がありますか?)。次に、2つの再帰的なケースを定義しますが、何らかの理由でヘッドのリストを再帰呼び出しなどに渡します。

実際問題は解決しやすいです。あなたはまず、より良いあなたのtakeFirst/2アキュムレータとtakeFirst/3`にリダイレクト:次

takeFirst(L,R) :- 
    takeFirst(L,0,R). 

を我々はベースケースを考えてみます。この場合

takeFirst([],R,R). 

:我々はリストの最後に到達しました私たちは最後に達しました。そして、アキュムレータの値、つまりこれまでの合計を追跡する変数が結果として返されます。

は、再帰的なケースでは、我々はリスト[H|T]を与え、私たちは頭HHので[[HH|_]|T]頭の中で興味を持っています。その場合は、アキュムレータにHHを追加し、Tで再帰呼び出しを行います。

takeFirst([[HH|_]|T],Ra,R) :- 
    Rb is Ra+HH, 
    takeFirst(T,Rb,R). 

だから我々が得る一緒にそれを置く:あなたの質問には非常に明確ではありませんでした

takeFirst(L,R) :- 
    takeFirst(L,0,R). 

takeFirst([],R,R). 
takeFirst([[HH|_]|T],Ra,R) :- 
    Rb is Ra+HH, 
    takeFirst(T,Rb,R). 

何かがどうあるべきかであります[[1,2,3],[],[7,8,9]]のように、リストに空のリストがある場合に実行します。上記の述語は失敗します:すべてのリストに少なくとも1つの要素があることを期待します。だから我々は、リストは、我々は単にテールで再帰呼び出しを実行した場合のパターン[[]|T]を、以下のケースを追加

takeFirst2(L,R) :- 
    takeFirst2(L,0,R). 

takeFirst2([],R,R). 
takeFirst2([[]|T],Ra,R) :- 
    takeFirst2(T,Ra,R). 
takeFirst2([[HH|_]|T],Ra,R) :- 
    Rb is Ra+HH, 
    takeFirst2(T,Rb,R). 

T:あなたは、単にこれらのリストを無視したい場合は、あなたがにあなたのコードを変更することができます。

述語の上に与えられたに基づいて、ヘッドのリストを構築することにも難しいことではありません。

heads([],[]) 
heads([[HH|_]|TA],[HH|TB]) :- 
    heads(TA,TB). 
関連する問題