我寫了一個謂語找到子列表:找出所有的子表
sublist([],[]).
sublist([X|T], [X|TS]) :-
sublist(T, TS).
sublist([_|T], X) :-
sublist(T, X).
但它是不正確的,因爲它會爲這個失敗:
sublist([1,2,20,4,5,6],[1,2,4,20]).
如何改變這種謂詞回答正確的。對於這個問題,沒有時間複雜性更大?
我寫了一個謂語找到子列表:找出所有的子表
sublist([],[]).
sublist([X|T], [X|TS]) :-
sublist(T, TS).
sublist([_|T], X) :-
sublist(T, X).
但它是不正確的,因爲它會爲這個失敗:
sublist([1,2,20,4,5,6],[1,2,4,20]).
如何改變這種謂詞回答正確的。對於這個問題,沒有時間複雜性更大?
2015年5月13日:完全重寫
這是一個有點不清楚你這裏經過什麼:您的謂詞被稱爲sublist
但是從你的例子查詢來看,好像你是一個subset
後。
無論如何,這裏是定義爲兩個謂詞:
sublist(?L1, +L2)
(順序和重複問題):
sublist([], L).
sublist([X|Xs], [X|Ys]) :- sublist(Xs, Ys).
sublist(Xs, [_|Ys]) :- sublist(Xs, Ys).
subset(?L1, +L2)
(順序和重複並不重要):
subset([], L).
subset([X|Xs], L) :- member(X, L), subset(Xs, L).
請注意,這些謂詞ma y存在於您的prolog實現的謂詞中。如果情況確實如此,你不應該嘗試重新定義那些。
你甚至意味着我猜的子集,因爲你不保存順序 – m09 2012-03-27 09:31:25