web-dev-qa-db-ja.com

Prologのリストの連結

誰かがこれらのルールのエラーを見つけるのを手伝ってくれる?

concat([], List, List).
concat([Head|[]], List, [Head|List]).
concat([Head|Tail], List, Concat) :- concat(Tail, List, C), concat(Head, C, Concat).

2つのリストを連結しようとすると失敗します。

| ?- concat([1,2], [4,7,0], What).

no
14
damluar

コードを修正するには、意図したとおりに、最後の句の[Head]への最後の呼び出しでHeadconcat/3に変換する必要があります。問題は、リストではない最初の引数としてのみHeadを使用して述語を呼び出したことでした。

しかし、ここにいくつかのメモがあります:

  • [Head|[]][Head]と同等です
  • アルゴリズムの複雑度が低い、n!私は信じている。
  • 2番目の句の後にカットが挿入されていない場合、長さ1のリストを使用して3番目の句を呼び出すことで無限の選択ポイントが生成されます(したがって、2番目の句が呼び出され、3番目の句が実行されます...無限ループ)。

これはSWI-plのバージョンであり、良いプロローグ再帰を示唆しています:

append([], List, List).
append([Head|Tail], List, [Head|Rest]) :-
    append(Tail, List, Rest).

再帰を適切に使用する方法を学びたい場合は、ここの最近の投稿または Learn Prolog Now! チュートリアルに他のリソースがあります。

17
m09

追加を使用して行うことができます。

concatenate(List1, List2, Result):-
   append(List1, List2, Result).

お役に立てれば。

5
João Rodrigues

これは、2つのリストルール間の連結です。

concat([],L2,L2). concat([Head|Tail],L2,[Head|L3]) :- concat(Tail,L2,L3). 
1
Ratan Deb