2011-11-11 6 views
1

私はプロローグで何かを書いていますが、私が追加した方法では、[a、b、c | _]のようなリストを返します。初期化されていない/任意の値をすべて削除する標準的な述語(または簡単な方法)はありますか?プロローグ内の初期化されていないリスト値を切り捨てる

編集の追加:リストが任意の長さである可能性があるため、長さが機能しない可能性があります。先行する予定がわからない場合は、既にそれをトリミングするために使用しています。

答えて

3

なぜ追加がそのようなリストを提供しているのかを確認する必要があります。あなたは、変数に到達するために、すべての要素を歩かなければならない。すなわち

close_list([]) :- !. 

close_list([_ | T]) :- 
    close_list(T). 

?- append([a,b,c|_], X, L). 
L = [a,b,c|X] 
?- append([a,b,c|_], X, L), X=[]. 
L = [a,b,c] 
+0

私は、私の述語の基本ケースがオフであったように見えます。ありがとう。 – LinearZoetrope

1

あなたはこのようなオープンリストを閉じることができます:あなたが見ている問題を修正追記のこの振る舞いを観察するため、 tailを作成し、空のリストにバインドします。

使用法:

?- List = [a, b, C, d, 2.2 | _], close_list(List). 
List = [a, b, C, d, 2.2]. 

あなたは尾にバインドされた変数を保持する場合、それははるかに簡単になる:

?- List = [a, b, C, d, 2.2 | Tail], Tail = []. 
List = [a, b, C, d, 2.2], 
Tail = []. 
2

あなたはこの目的のためにlength/2を使用することができます!

?- Xs = [1,2,3|_], length(Xs, N). 
Xs = [1,2,3], 
N = 3 ; 
Xs = [1,2,3,_G1022], 
N = 4 ; 
Xs = [1,2,3,_G1022,_G1025], 
N = 5 

ただし、ここで説明したい内容はわかりません。最小の解決策を採用したい場合は、代わりにonce(length(Xs, N))を使用してください。

2

リストが終了していない場合は、[]でリストを間違って作成している可能性があります。

関連する問題