1

ほら、我慢して。全体的な目標は、2 つのリスト間の最大の配置を返すことです。同じ長さのアラインメントが複数ある場合は、最初のものを返すことができます。

アラインメントとは、2 つのリストが共有する要素を正しい順序で共有することを意味しますが、必ずしも順序どおりである必要はありません。1,2,3 および 1,2,9,3; ここでは、1,2,3 が最長のアラインメントになります。誰でも、私がすでに定義した述語を知っています。

align(Xs, Ys, [El | T]) :-append(_, [El | T1], Xs),append(_, [El | T2], Ys),align(T1, T2, T).
align(_Xs, _Ys, []).

次に、組み込みの述語 findall を使用して、これらのリスト間のすべてのアラインメントのリストを取得しますか? この場合、最大のアラインメントが最初に配置されますが、その理由はわかりません。

findall(X,align([1,2,3],[1,2,9,3],X),L).

それは以下を返します;

L = [[1, 2, 3], [1, 2], [1, 3], [1], [2, 3], [2], [3], []]. 

その通りですが、これら 2 つを組み合わせて、リストのリストの中で最大のリストを返す述語が必要です。

4

2 に答える 2

1

この回答に記載されている解決策を使用してください。

findall/3最大の要素を見つけるためにリストを作成する必要がないため、 の使用を避けることもできます。

于 2009-11-03T23:52:02.407 に答える
-1

では、リスト内の最大の項目を見つけるだけでよいのでしょうか?

編集:

わかりましたので、より良い答えは次のとおりです。

パフォーマンスが気になる場合は、リストをスキャンして最大の項目を追跡する独自の述語を作成する必要があります。

パフォーマンスをあまり重視せず、機能させたいだけの場合は、並べ替えを逆にして、並べ替えられたリストの最初の項目を取得できます。これの利点は、ソート ライブラリ述語を使用することで、数行で実装できることです。

于 2009-11-03T17:16:29.753 に答える