0

如果两个列表具有相同的长度并且除第一个和最后一个之外的所有元素都相同,则它们是同系的。我已经设法在长度之间进行了比较,但是如何查看元素是否相同,除了两个列表中的第一个和最后一个。
这是我的代码:

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

ex of what is syngeneic list -> sug([a,b,c,d],[d,b,c,a])

4

3 回答 3

1

你可以用几个规则来做到这一点:

  1. 空列表是同源的
  2. 当列表的尾部相同时,除了可能是最后一个元素之外,列表是同系的
  3. 空列表是一样的
  4. 对于规则 2,只有一个元素的列表是相同的
  5. 如果列表的头部匹配且尾部对于规则 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

假设列表中必须至少有两个元素(以便它们在每个对应列表中有所不同),您可以使用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 回答
0

为什么不呢,在 SWI-Prolog 中:

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