[解決済み] Prologでリストを平坦にする
2022-02-16 01:56:01
質問
Prologを使い始めてまだ数日しか経っていません。 いくつかのことは理解していますが、これは本当に私を混乱させるものです。
リストを受け取って平坦化する関数を書けということですね。
?- flatten([a,[b,c],[[d],[],[e]]],Xs).
Xs = [a,b,c,d,e]. % expected result
この関数は,リストの内部構造を取り出します.
今のところ、こんな感じです。
flatten2([],[]).
flatten2([Atom|ListTail],[Atom|RetList]) :-
atom(Atom), flatten2(ListTail,RetList).
flatten2([List|ListTail],RetList) :-
flatten2(List,RetList).
さて、これで電話をかけると動作するようになりました。
?- flatten2([a,[b,c],[[d],[],[e]]], R).
R = [a,b,c,d,e]. % works as expected!
しかし、入力したリストがすでにフラット化されているかどうかを確認するために呼び出すと、次のような結果が返されます。
false
ではなく
true
:
?- flatten2([a,[b,c],[[d],[],[e]]], [a,b,c,d,e]).
false. % BAD result!
なぜ片方ではうまくいくのにもう片方ではうまくいかないのでしょうか? 何かとても単純なことを見逃しているような気がするのですが。
解決方法は?
の定義は
flatten2/2
のような挙動をします。
?- flatten2([a, [b,c], [[d],[],[e]]], R).
R = [a, b, c] ;
false.
ということは、すでに
R
に
[a,b,c,d,e]
ということであれば、失敗しても不思議ではありません。
あなたの定義は、リストの末尾を捨てている(
ListTail
を経由して返すリストに接続する必要があります。
RetList
. 以下はその提案である。
flatten2([], []) :- !.
flatten2([L|Ls], FlatL) :-
!,
flatten2(L, NewL),
flatten2(Ls, NewLs),
append(NewL, NewLs, FlatL).
flatten2(L, [L]).
これは、すべてのリストのリストを再帰的に単一アイテムリストに変換するものです。
[x]
または空のリスト
[]
を捨てます。そして、それらを蓄積し、再び1つのリストに追加して出力します。
ほとんどのPrologの実装では、空のリストである
[]
はアトム
と
の呼び出しはリストなので
atom([])
と
is_list([])
は両方ともtrueと評価されます。これは、文字アトムとは対照的に、空のリストを捨てるのには役立ちません。
関連
-
[解決済み] リストのリストからフラットなリストを作るには?
-
[解決済み] リスト内のアイテムのインデックスを検索する
-
[解決済み] リストが空かどうかを確認するにはどうすればよいですか?
-
[解決済み] Pythonのリストメソッドであるappendとextendの違いは何ですか?
-
[解決済み] 割り当て後にリストが予期せず変更されました。その理由と防止策を教えてください。
-
[解決済み] リストを均等な大きさの塊に分割するには?
-
[解決済み] リストの最後の要素を取得する方法
-
[解決済み] リストの要素数を取得する方法
-
[解決済み] リストからランダムに項目を選択するにはどうすればよいですか?
-
[解決済み] 配列の結合/平坦化
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Prolog リストから要素を削除する
-
[解決済み] リスト内の連続した重複を識別する最もPythonicな方法は何でしょうか?
-
[解決済み] Haskellでelemを使わずにリストから重複を削除する
-
[解決済み] Prologでリストを平坦にする
-
error C2955: 'std::list' : クラステンプレートの使用にはテンプレート引数のリストが必要です。
-
IEnumerableとDataTableの互換性
-
QuerySetを配列に変換する:Pythonのlist()関数を直接使用、list()はstr()やint()に類似しています。
-
[解決済み] Python: リストからpandasのデータフレームを作成する
-
[解決済み] Powershellですべてのデバイス、パーティション、ボリュームを一覧表示する
-
[解決済み】Scalaのリスト連結、::と++の比較