2012-05-04 60 views
1

我想從這樣的列表來構建:[name1(value1), name2(value2),...]一個這樣的名單:[value1, value2,...],我有以下代碼:Prolog的建設,用列表的= ../2

construct_listv([],_). 
    construct_listv([A0|T], Values) :- 
     A0 =.. [_, Value], 
     append([Value], [], Values), 
     construct_listv(T, Values). 

如果我把用於示例construct_listv([su(2), se(5)], ResultList)

誰能告訴我,爲什麼第二次調用追加失敗,正確的方式做到這一點?

回答

3

您正在使用Values其中兩個結果都需要,從而在交叉的目的。

請注意,遞歸案例construct_listv/2需要處理第一個參數的Head和Tail。每個將有助於第二個參數的建設,但你有附加/ 3確定輸出,在衝突到construct_listv/2遞歸調用希望如何確定它。

也許你的意思是:

construct_listv([],[]). 
construct_listv([A0|T], [V|Values]) :- 
    A0 =.. [_, V], 
    construct_listv(T, Values). 

現在你不再需要任何調用附加/ 3。遞歸負責爲您建立輸出參數!

+0

感謝hardmath,這正是問題 – mll

1

爲什麼不

construct_list(L1, L2) :- 
    maplist(construct_one, L1, L2). 

construct_one(X, V) :- 
    X =.. [_, V]. 
+0

看到它的另一種方式,感謝joel76 – mll