0

2 つのリストの長さが同じで、最初と最後を除いてすべての要素が同じである場合、2 つのリストは同系です。長さの比較はできましたが、2つのリストの最初と最後を除いて要素が同じかどうかを確認する方法.
これが私のコードです:

sug([H|T],[H1|T1]) :-
   length([H|T],N),
   length([H1|T1],M),
   N==M.

同系リストとは何かの例 -> sug([a,b,c,d],[d,b,c,a])

4

3 に答える 3

1

いくつかのルールでそれを行うことができます:

  1. 空のリストは同系です
  2. おそらく最後の要素を除いて末尾が同じ場合、リストは同系です
  3. 空のリストは同じです
  4. 要素が 1 つだけのリストは、ルール 2 の目的では同じです
  5. リストは、ルール 2 の目的でヘッドが一致し、テールが同じである場合、ルール 2 の目的で同じです。

上記のルールでは、要素数が異なる 2 つのリストが一致することはないため、長さを明示的にチェックする必要はありません。

上記のルールを Prolog でコーディングする方法は次のとおりです。基本的には、行単位で一致します。

sug([], []).
sug([_|T1], [_|T2]) :- sameExceptLast(T1, T2).
sameExceptLast([], []).
sameExceptLast([_], [_]).
sameExceptLast([X|T1], [X|T2]) :- sameExceptLast(T1, T2).

これはideoneのデモです。

于 2013-04-02T16:32:22.483 に答える
0

なぜ、SWI-Prolog で:

sug(L1, L2) :-
    append([[_], Ls, [_]], L1),
    append([[_], Ls, [_]], L2).
于 2013-04-02T22:33:24.437 に答える
0

リストに少なくとも 2 つの要素が必要であると仮定すると (対応する各リストで異なるように)、 を使用append/3して中間リストを照合し、最初と最後の要素が異なることを確認できます。

sug([HL|LTail], [HR|RTail]):-
  HL \= HR,
  append(L, [LL], LTail),
  append(L, [LR], RTail),
  LL \= LR.

最初と最後の項目が異なる必要がない場合 (そうかもしれないし、そうでないかもしれません)、手順は次のようになります。

sug([_|LTail], [_|RTail]):-
  append(L, [_], LTail),
  append(L, [_], RTail).
于 2013-04-02T16:35:00.273 に答える