首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >测试列表,以查看它们是否是另一个列表的前缀或后缀。

测试列表,以查看它们是否是另一个列表的前缀或后缀。
EN

Stack Overflow用户
提问于 2013-11-18 02:01:17
回答 3查看 6.2K关注 0票数 1

我被一个问题困住了。我想知道我能不能得到一些帮助。

设计一个谓词bookend/3,测试第一个列表参数是否是第三个的前缀,第二个是第三个的后缀。注意,第一个和第二个参数中的列表可能重叠。 示例输出

代码语言:javascript
复制
?-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.

到目前为止我拥有的

代码语言:javascript
复制
suffix(Suffix,Suffix).
prefix([_|L],Suffix):- suffix(L,Suffix).
bookends([],[],[]).
bookends([X|L],[X|L1],[X|L2]):-
    prefix(L,L2),
    suffix(L1,L2).

我如何获得工作后缀,或我是否接近错误?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-18 02:09:50

让前缀和后缀来完成所有的工作:

代码语言:javascript
复制
bookends(A,B,C) :- prefix(A,C), suffix(B,C).

空列表总是任何事物的前缀:

代码语言:javascript
复制
prefix([],_).

如果它们共享相同的第一个元素,则检查其他元素。

代码语言:javascript
复制
prefix([A|B],[A|C]) :- prefix(B,C).

您可能需要编写反向代码:

代码语言:javascript
复制
suffix(A,B) :- reverse(A,AR), reverse(B,BR), prefix(AR,BR).
票数 1
EN

Stack Overflow用户

发布于 2013-11-18 03:48:50

代码语言:javascript
复制
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).

... --> [] | [_], ... .
票数 1
EN

Stack Overflow用户

发布于 2013-11-18 16:52:44

我要指出的是,附件作为后缀使用。

代码语言:javascript
复制
append(_, Suffix, Something) 

当后缀是某物的后缀时成功

代码语言:javascript
复制
append(Prefix, _, Something) 

当前缀是某物的前缀时成功

代码语言:javascript
复制
bookends(Pre, Suff, X) :-
     append(Pre, _, X),
     append(_, Suff, X).

有一个list_append,附加/2

代码语言:javascript
复制
bookends(Pre, Suff, X) :-  append([Pre, _, Suff], X).

最能表达意图的

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20038838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档