测试列表以查看它们是另一个列表的前缀还是后缀

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).

实际上最能表达意图

【讨论】:

以上是关于测试列表以查看它们是另一个列表的前缀还是后缀的主要内容,如果未能解决你的问题,请参考以下文章

查找列表/文件中以特定前缀/后缀开头/结尾的所有单词

比较两个字母数字房间号码以确定楼层前缀

Python - 通过列表中的前缀和后缀删除元组

在文本列表中提取唯一值,其中每个项目具有恒定的公共前缀或后缀或两者兼有

不仅仅是另一个“选择列表中的列无效”错误

SwiftUI 列表中某些行的布局问题