2013-02-22 129 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