我正在尝试弄清楚如何使用尾递归来将给定的列表与此模式进行划分。例如,实例列表等于1,2,3,4。
clause([1,2,3,4],X). would return:
X = [1,2,3,4]
X = [1,2,3]
X = [2,3,4]
X = [1,2]
X = [2,3]
X = [3,4]
X = [1]
X = [2]
X = [3]
X = [4]如果能给我任何建议,我将不胜感激。
发布于 2016-03-30 05:41:52
list_sublist(Xs, Ys) :-
Ys = [_|_],
phrase(( ..., seq(Ys), ...), Xs).
... --> [] | [_], ... .
seq([]) --> [].
seq([E|Es]) --> [E], seq(Es).
| ?- list_sublist([1,2,3,4], Xs).
Xs = [1] ;
Xs = [1,2] ;
Xs = [1,2,3] ;
Xs = [1,2,3,4] ;
Xs = [2] ;
Xs = [2,3] ;
Xs = [2,3,4] ;
Xs = [3] ;
Xs = [3,4] ;
Xs = [4].发布于 2016-03-30 14:28:43
有一个SWISH sample展示了如何获得组成更简单模式的功能:
suffix(Xs, Ys) :-
append(_, Ys, Xs).
prefix(Xs, Ys) :-
append(Ys, _, Xs).
sublist_not_empty(Xs, [Y|Ys]) :-
suffix(Xs, Zs),
prefix(Zs, [Y|Ys]).我添加了“非空”条件,因为Y|Y不能匹配空列表。
https://stackoverflow.com/questions/36295374
复制相似问题