通过在prolog中的列表中用加号运算符替换逗号来展平列表

时间:2012-03-11 04:37:42

标签: list prolog logic flatten

我正在研究Prolog(eclipse)中的一个场景,其中我需要一个列表结构来重新格式化。

我有一份表格清单:

MyList = [a,b,c].

我试图看看是否可以将列表展平为单个元素,并将所有逗号替换为+运算符。

所以我的结果列表如下:

ResultList = [a+b+c] 

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

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

3 个答案:

答案 0 :(得分: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。

修改: 有一个错误: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).

答案 1 :(得分: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)]

答案 2 :(得分:0)

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

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


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

编辑:这适用于Swi-prolog ..不确定Eclipse。