2013-02-22 158 views
1

我是Prolog的新手,有時無法將頭圍繞在某些事物上。我知道如何將此列表轉換爲以下格式的條目:Prolog - 將列表轉換爲術語列表

listOfTerms(ListOfArgs,Name, ListOfResults) 
listOfTerms([[1,2],[100,99],[5,11]],+,T). 
T = +([1, 2], [100, 99], [5, 11]). 

如何讓它看起來像這樣?

T = [1+2, 100+99, 5+11]. 

listOfTerms(Lst,F,[1+2, 100+99, 5+11]). 
Lst = [[1, 2], [100, 99], [5, 11]], 
F = + . 
+0

你的問題還不清楚。你的第一個例子沒有在任何地方使用T,但它出現在結果中。 – liori 2013-02-22 18:33:21

+0

對不起。我修好了它。 – user1834372 2013-02-22 18:43:27

回答

1

我會做這樣的事情:

listOfTerms(ListOfArgs, Name, ListOfResults):- 
    maplist(map(Name), ListOfArgs, ListOfResults). 

map(Functor, Arg, Term):- 
    Term=..[Functor|Arg]. 

使用=.. (univ)斷言,從他們的觀點或擺脫期限的參數構建的條款,並使用maplist這個轉換應用於各列表中的一對元素。

如果你想避免使用maplist,你可以定義一個遞歸過程:

listOfTerms([], _, []). 
listOfTerms([Arg|ListOfArgs], Functor, [Term|ListOfTerms]):- 
    Term=..[Functor|Arg], 
    listOfTerms(ListOfArgs, Functor, ListOfTerms). 
+0

謝謝。有沒有辦法做到這一點遞歸和沒有maplist? – user1834372 2013-02-22 18:40:56

+0

@ user1834372:當然,請參閱已編輯的答案。您需要的僅僅是將univ謂詞應用於這兩個列表的元素。 – gusbro 2013-02-22 18:54:59