我试图弄清楚如何使用尾递归来将给定列表与此模式分开。例如,list等于[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]
我很乐意就此提出任何建议。
答案 0 :(得分:3)
您需要一个新名称,clause/2
已被内置谓词占用。
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].
答案 1 :(得分:0)
有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 | Ys]无法匹配空列表。