定义sublist(Xs, Ys)
:
当Xs
是包含Ys
的某些元素的列表时,这与它们在列表Ys
中显示的顺序相同。例如,sublist(X,[a,b,c])
应该包含八个解决方案X=[]; X=[c]; X=[b]; X=[b,c]; X=[a]; X=[a,c]; X=[a,b];
和X=[a,b,c].
我的解决方案是这样的:
sublist([],[]).
sublist([],[_|_]).
sublist([X|Xs],[Y|Ys]):- (
X=Y->sublist(Xs,Ys);
sublist([X|Xs],Ys)
).
但是,它只输出:
X = [] ;
X = [a] ;
X = [a, b] ;
X = [a, b, c].
我的解决方案有什么问题?
答案 0 :(得分:0)
如评论中所述,问题出在你的if语句中。你应该像这样重写你的程序:
sublist([],[]).
sublist([],[_|_]).
sublist([X|Xs],[X|Ys]):-
sublist(Xs,Ys).
sublist([X|Xs],[_|Ys]):-
sublist([X|Xs],Ys).
?- sublist(A,[a,b,c]).
A = []
A = [a]
A = [a, b]
A = [a, b, c]
A = [a, c]
A = [b]
A = [b, c]
A = [c]
BTW,sublist/2
是SWI中的内置谓词。您可以查看该实现(取自here):
sublist(L, L).
sublist(Sub, [H|T]) :-
sublist_(T, H, Sub).
sublist_(Sub, _, Sub).
sublist_([H|T], _, Sub) :-
sublist_(T, H, Sub).
sublist_([H|T], X, [X|Sub]) :-
sublist_(T, H, Sub).