在prolog中定义谓词

时间:2018-04-25 09:48:41

标签: prolog

定义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].

我的解决方案有什么问题?

1 个答案:

答案 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).