ほら、我慢して。全体的な目標は、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 つを組み合わせて、リストのリストの中で最大のリストを返す述語が必要です。