2012-03-11 95 views
2

我正在使用Prolog(eclipse)中的场景,其中需要重新格式化列表结构。通过在prolog中用列表中的加号运算符替换逗号来展开列表

我有以下形式的列表:

MyList = [a,b,c]. 

我是想看看我是否能与+操作取代了所有逗号拼合列表的单个元素。

所以我的结果列表如下所示:

ResultList = [a+b+c] 

这是一个单一的元素列表。初始列表的长度是任意的。

我知道prolog不适合这样的操作,但可以这样做吗?

回答

4

它在标准的Prolog中。我觉得应该有与Eclipse没有什么区别:

list_to_op([X,Y|T], [R]) :- 
    list_to_op(T, X+Y, R). 

编辑:错误的假

list_to_op([X], [X]). 

list_to_op([X], R, R+X). 
list_to_op([X|T], R, Q) :- 
    list_to_op(T, R+X, Q). 

测试指出:

?- list_to_op([a,b,c],X). 
X = [a+b+c] . 

累加器需要给予适当的关联性:更简单,更直观的定义

list_to_op1([X], X). 
list_to_op1([X|R], X+T) :- 
    list_to_op1(R, T). 

?- list_to_op1([a,b,c],X). 
X = a+ (b+c) . 

如果评估顺序很重要,使用list_to_op。

编辑: 有一个bug:list_to_op([a,b],X)失败。

这里的校正,经常发生,这是一个简化:

list_to_op([], R, R). 
list_to_op([X|T], R, Q) :- 
    list_to_op(T, R+X, Q). 
+0

谢谢。正是我在找的东西。 – kallakafar 2012-03-11 09:31:15

+0

对不起,我发现一个bug,看编辑 – CapelliC 2012-03-11 09:46:34

+0

@chac'list_to_op([3],Op)'失败。意? – false 2012-03-13 20:53:09

1

这可能有助于

flatten_list(A,[B]) :- flatten_list_inner(A,B). 

flatten_list_inner([A],A). 
flatten_list_inner([H|T],H+Y) :- flatten_list_inner(T,Y). 

输出是你想要的略有不同。它目前是[a +(b + c)]

+0

与我过去几个月编写和使用的内容几乎相同(除了谓词和参数名称)。由于+是中缀运算符,因此当写入来自** flatten_list_inner/2 **的复合项时,会出现那些讨厌的括号。但是这样的术语可以通过** is/2 **来评估(如果原子a,b,c被数字替换)。 – hardmath 2012-03-11 11:52:10

0

怎么样这个非递归版本..

list_to_op(L, Res) :- 
    concat_atom(L, '+', Atom), 
    Res = [Atom]. 


?- list_to_op([a,b,c], X). 
X = ['a+b+c']. 

编辑:这工作在束缚水饱和度,序言..不确定关于Eclipse。