Prolog 如何构建;“链锁”;长度为n的列表

Prolog 如何构建;“链锁”;长度为n的列表,prolog,Prolog,如何概括以下语句来构造长度为n的链表L list(1,S1,S2,L) :- L = [[S1,S2]]]. list(2,S1,S2,L) :- L = [[S1,S3]],[S3,S2]]]. list(3,S1,S2,L) :- L = [[S1,S3]],[S3,S4]],[S4,S2]]]. list(4,S1,S2,L) :- L = [[S1,S3]],[S3,S4]],[S4,S5]],[S5,S2]]]. list(5,S1,S2,L) :- L = [[S

如何概括以下语句来构造长度为
n
的链表
L

list(1,S1,S2,L) :-
  L = [[S1,S2]]].
list(2,S1,S2,L) :-
  L = [[S1,S3]],[S3,S2]]].
list(3,S1,S2,L) :-
  L = [[S1,S3]],[S3,S4]],[S4,S2]]].
list(4,S1,S2,L) :-
  L = [[S1,S3]],[S3,S4]],[S4,S5]],[S5,S2]]].
list(5,S1,S2,L) :-
  L = [[S1,S3]],[S3,S4]],[S4,S5]],[S5,S6],[S6,S2]]].
那么:

chain(N, S0, S, Ls) :-
    length(Ls, N),
    chain_(Ls, S0, S).

chain_([], S, S).
chain_([[S0,S1]|Ls], S0, S) :-
    chain_(Ls, S1, S).
或等效地使用
foldl/4

chain(N, S0, S, Ls) :-
    length(Ls, N),
    foldl(chain_, Ls, S0, S).

chain_([S0,S], S0, S).
查询示例:

?-  chain(3, S0, S, Ls).
Ls = [[S0, _G1584], [_G1584, _G1593], [_G1593, S]].
那么:

chain(N, S0, S, Ls) :-
    length(Ls, N),
    chain_(Ls, S0, S).

chain_([], S, S).
chain_([[S0,S1]|Ls], S0, S) :-
    chain_(Ls, S1, S).
或等效地使用
foldl/4

chain(N, S0, S, Ls) :-
    length(Ls, N),
    foldl(chain_, Ls, S0, S).

chain_([S0,S], S0, S).
查询示例:

?-  chain(3, S0, S, Ls).
Ls = [[S0, _G1584], [_G1584, _G1593], [_G1593, S]].
测试:

测试:


list(0,S1,S2,L)
失败有意义吗?
list(0,S1,S2,L)
失败有意义吗?