如果两个列表具有相同的长度并且除第一个和最后一个之外的所有元素都相同,则它们是同系的。我已经设法在长度之间进行了比较,但是如何查看元素是否相同,除了两个列表中的第一个和最后一个。
这是我的代码:
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])
如果两个列表具有相同的长度并且除第一个和最后一个之外的所有元素都相同,则它们是同系的。我已经设法在长度之间进行了比较,但是如何查看元素是否相同,除了两个列表中的第一个和最后一个。
这是我的代码:
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])
你可以用几个规则来做到这一点:
无需显式检查长度,因为上面的规则永远不会匹配具有不同数量元素的两个列表。
以下是如何在 Prolog 中对上述规则进行编码 - 本质上,存在逐行匹配:
sug([], []).
sug([_|T1], [_|T2]) :- sameExceptLast(T1, T2).
sameExceptLast([], []).
sameExceptLast([_], [_]).
sameExceptLast([X|T1], [X|T2]) :- sameExceptLast(T1, T2).
假设列表中必须至少有两个元素(以便它们在每个对应列表中有所不同),您可以使用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).
为什么不呢,在 SWI-Prolog 中:
sug(L1, L2) :-
append([[_], Ls, [_]], L1),
append([[_], Ls, [_]], L2).