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

时间:2013-11-18 02:01:18

标签: list prolog prefix dcg

我遇到了问题。我想知道我是否能得到一些帮助。

  

设计一个谓词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).

如何使用后缀,或者我是否接近这个错误?

3 个答案:

答案 0 :(得分: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).

答案 1 :(得分:1)

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

... --> [] | [_], ... .

答案 2 :(得分:1)

我指出append的作用是后缀

append(_, Suffix, Something) 
当后缀是某事物的后缀

时,

成功

append(Prefix, _, Something) 
当前缀是某事的前缀

时,

成功

bookends(Pre, Suff, X) :-
     append(Pre, _, X),
     append(_, Suff, X).

有一个list_append,追加/ 2

bookends(Pre, Suff, X) :-  append([Pre, _, Suff], X).

实际上表达了最佳意图