0

アラインメントとは、述語が 2 つのリストを受け取ることを意味します。そして、配置リスト内のすべての項目が実際に他の両方のライトの要素であることを確認します。また、順序に関する要件があるため、配置リスト内のすべての項目が他の両方の入力ライトのメンバーであることを確認するだけでは除外されます。メンバーをチェックするだけでは、有効な配置は反転しても有効になります。もちろん、これは間違っています。

Example:
?- mxAli([4,2,9,8],[1,9,5,2,3,8],A).
A=[2,8] or A=[9,8]

ここでは 8,2 と 8,9 は無効です。

実際にどのように順序をチェックするかを考えると、命令型言語のプログラミングに頭が下がります。どんな入力でも大歓迎です。しかし、すぐに答えを出さないでください。何について読むべきかについてのヒントが欲しいのです。(これを言わなければならないのは、私がこのサイトで非常に良い助けを得ているので、これを指摘しないとあまりにも不正行為に近いからです)。

私の考えでは、 I または prolog は、現在の要素のインデックスの後に検索を続行する必要があります。それは逆アラインメントを無効にしますか?

編集:両方のリストで現在の要素のインデックスの後に、検索を続行する必要があります。上記の例のように、2 が見つかると、インデックス 2 とインデックス 5 で次の要素の検索を開始します (最初の要素は 1 です)。

4

2 に答える 2

1

アラインメントをチェックする単純な方法はappend/3、次のようなものを使用することです。

append(_, [El | T1], L1),
append(_, [El | T2], L2),
...

とは与えられたリストであり、L1はそれらが共有しなければならない要素です。後で確認して調整できます。L2ElT1T2

以下は完全なソリューションです。

align(L1, L2, [El | T]) :-
    append(_, [El | T1], L1),
    append(_, [El | T2], L2),
    align(T1, T2, T).

align(_L1, _L2, []).

% Test, executed at consult time
:- align([4,2,9,8], [1,9,5,2,3,8], Alignment), writeln(Alignment), fail; true.

テストは次のように出力します。

[2, 8]
[2]
[9, 8]
[9]
[8]
[]
于 2009-10-31T09:56:31.517 に答える
1

重要なのは、アルゴリズム的に考えすぎるのではなく、述語が真であるべきケースを経験することです。

ここで、アラインメント リスト (第 3 引数) が空である場合と、空でない場合を考えてみます。空でない場合は、出力リストの最初の要素を保持する必要があるものを記述し、残りのリストには再帰を使用します。

于 2009-11-01T12:37:59.417 に答える