2012-11-23 109 views
-1

當且僅當L是包含R中不是列表的所有項的列表時,我需要編寫一個成功的謂詞f(L,R)。 例如:Prolog中的子列表中的所有元素的列表

f(L,[1,2,3,[4,5,6],[[7,8,9]],[]]). 

應該給:

L = [1,2,3,4,5,6,7,8,9] 

我寫了一個謂詞,給出了以下的結果,而不是:

L = [1,2,3,4,5,6,7,8,9,[]] 

空列表不應該出現在結果中。我的謂語如下:

f([],[]). 
f(V,[H|T]):- H = [_|_] -> append(L,R,V), 
       f(L,H), f(R,T),!; 
       V = [H1|T1], H1=H, f(T1,T). 

我有兩個疑問。首先,空列表不應該出現在結果中。另外我不知道爲什麼它不起作用,如果我不切(!)。事實上,如果我不放棄它,它給了我上面的結果,但如果我要求另一個結果,它會永遠循環。我真的不明白爲什麼這會循環。

+1

見本問題http://stackoverflow.com/questions/11220567/flatting-a-list/。通常,Input是第一個參數,輸出第二個參數,例如f([1,2,3,[4,5,6],[[7,8,9]],[]],L)==> L [1,2,3,4,5,6,7,8,9] – joel76

回答

1

要刪除空列表,請處理該情況(放棄它)。

關於循環:我認爲原因可能是你調用append(L,R,V)與所有參數沒有實例化:在遞歸調用後移動append。

最後,也許你不使用正確的「如果當時別人的構造:我已經使用通常的SWI-Prolog的源式的縮進,使用縮進來突出「順序」呼籲

f([], []). 
f(V, [H|T]) :- 
    ( H = []  % if H = [] 
    -> f(V, T)  % then discard 
    ; H = [_|_] % else if H is list 
    -> f(L,H),  % flat head 
     f(R,T),  % ... 
     append(L,R,V) 
    ; V = [H|T1], % else 
     f(T1,T)  % ... 
    ). 
+0

非常感謝您的提示!現在它完美地工作。 – markusian