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)
失败有意义吗?