2016-10-23 37 views
0

好日子,在Prolog中過濾和修改列表

我有一個任務,給出一個列表[3,9,11,2,14],我想過濾掉任何大於6的值。現在有這個工作。

sift([],[]). 
sift([X|T], [X|Result]):- 
    X > 6,       /* is X greater than 6 */ 
    write(isList(Result)), 
    /* append([X]|['CCC'], [Result]), but this didn't work */ 
    sift(T,Result).    /* if so then go find the rest */ 
sift([ThrowAway|Tail],Result):- /* disregard the head */ 
    sift(Tail,Result).    /* and look in the tail */ 

正如我前面提到的,這將返回正確的結果。我的困境是,如果的值大於6,我想在符合條件的數字後添加'CCC'的附加值。所以它看起來像:

[9,CCC,11,CCC,14,CCC]。

我試着寫出來的列表中的內容,但是當我做,我得到的值:

12 ?- sift([3,9,11,2,14], Results). 
isList(_G2271)isList(_G2276)isList(_G2281) 
Results = [9, 11, 14]. 
13 ?- 

我試圖檢查列表的內容,看看它是什麼。

有沒有人有任何想法我可以做到這一點?

TIA,

COSON

回答

1

時加入append([X]|['CCC'], [Result])是你實例Result=[X,'CCC']問題。您不只是將'CCC'添加到Result,而是將[X]['CCC']相加,其結果是結果列表結果(所以Result=[X,'CCC'])。之後當你撥打sift(T,Result)。結果已完全實例化,因此添加元素將返回false。

還有另外一個問題,查詢?- sift([3,9,11,2,14], Results).給出:

?- sift([3,9,11,2,14], Results). 
isList(_G1296)isList(_G1301)isList(_G1306) 
Results = [9, 11, 14] ; 
Results = [9, 11] ; 
isList(_G1301) 
Results = [9, 14] ; 
Results = [9] ; 
isList(_G1296)isList(_G1301) 
Results = [11, 14] ; 
Results = [11] ; 
isList(_G1296) 
Results = [14] ; 
Results = []. 

它讓這麼多的名單,由於事實,你的第三條:所有輸入的情況相匹配。要解決這個問題,你可以在第三個子句中添加X=<6

最後,你可以寫:

sift([],[]). 
sift([X|T],[X,'CCC'|Result]):-X > 6,sift(T,Result). 
sift([ThrowAway|Tail],Result):-ThrowAway=<6,sift(Tail,Result). 

它修正了這兩個問題。在你的例子中:

?- sift([3,9,11,2,14], Results). 
Results = [9, 'CCC', 11, 'CCC', 14, 'CCC'] ; 
false.