测试列表以查看它们是另一个列表的前缀还是后缀
Posted
技术标签:
【中文标题】测试列表以查看它们是另一个列表的前缀还是后缀【英文标题】:Test lists to see if they are a prefix or suffix of another list 【发布时间】:2013-11-18 02:01:17 【问题描述】:我遇到了一个问题。我想知道是否可以得到一些帮助。
设计一个谓词 bookends/3 来测试第一个列表参数是否为 第三个的前缀和第二个是第三个的后缀。注意 第一个和第二个参数中的列表可能重叠。
示例输出
?-bookends([1],[3,4,5],[1,2,3,4,5]).
true.
?-bookends([],[4],[1,2,3,4]).
true.
?-bookends([1,2,3],[3,4],[1,2,3,4]).
true.
?-bookends([1],[2,3],[1,2,3,4]).
false.
目前为止我所拥有的
suffix(Suffix,Suffix).
prefix([_|L],Suffix):- suffix(L,Suffix).
bookends([],[],[]).
bookends([X|L],[X|L1],[X|L2]):-
prefix(L,L2),
suffix(L1,L2).
我如何让后缀工作,或者我接近这个错误?
【问题讨论】:
bookends([1,2,3],[3,4,5],[1,2,3,4,5]).
应该是真还是假?如果你允许这样的重叠,那么你可以使用bookends(A, B, C) :- append(A, _, C), append(_, B, C).
@mbratch:非常漂亮。 (只是投赞成票并不公平)
【参考方案1】:
让前缀和后缀完成所有工作:
bookends(A,B,C) :- prefix(A,C), suffix(B,C).
空列表总是任何东西的前缀:
prefix([],_).
如果它们共享相同的第一个元素,请检查其余部分
prefix([A|B],[A|C]) :- prefix(B,C).
你可能需要反写:
suffix(A,B) :- reverse(A,AR), reverse(B,BR), prefix(AR,BR).
【讨论】:
非常感谢!我一直坚持写自己的后缀。【参考方案2】:bookends(A, B, C) :-
phrase((seq(A),...), C),
phrase((...,seq(B)), C).
bookends_optimized(A, B, C) :- % OK if C is a list
phrase(seq(A), C,_),
phrase(..., C,B).
bookends_no_overlap(A, B, C) :-
phrase((seq(A),...,seq(B)), C).
seq([]) --> [].
seq([E|Es]) --> [E], seq(Es).
... --> [] | [_], ... .
【讨论】:
【参考方案3】:我要指出 append 作为后缀起作用
append(_, Suffix, Something)
Suffix 是某事物的后缀时成功
append(Prefix, _, Something)
Prefix 是某事物的前缀时成功
bookends(Pre, Suff, X) :-
append(Pre, _, X),
append(_, Suff, X).
有一个 list_append, append/2
bookends(Pre, Suff, X) :- append([Pre, _, Suff], X).
实际上最能表达意图
【讨论】:
以上是关于测试列表以查看它们是另一个列表的前缀还是后缀的主要内容,如果未能解决你的问题,请参考以下文章