2012-03-27 68 views
2

我寫了一個謂語找到子列表:找出所有的子表

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]). 

如何改變這種謂詞回答正確的。對於這個問題,沒有時間複雜性更大?

+0

你甚至意味着我猜的子集,因爲你不保存順序 – m09 2012-03-27 09:31:25

回答

0

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實現的謂詞中。如果情況確實如此,你不應該嘗試重新定義那些。

+2

你的代碼也會返回'true'給子集([1,2],[1,1])。',這可能會不正確。 – twinterer 2012-03-27 09:44:09

+0

是的,你必須用'select/3'而不是'member/2'去。 – m09 2012-03-27 09:47:39

+1

bulitin排序工作更快我認爲 – whd 2012-03-27 09:54:37