我正在研究Prolog(eclipse)中的一个场景,其中我需要一个列表结构来重新格式化。
我有一份表格清单:
MyList = [a,b,c].
我试图看看是否可以将列表展平为单个元素,并将所有逗号替换为+运算符。
所以我的结果列表如下:
ResultList = [a+b+c]
是单个元素列表。初始列表的长度是任意的。
我知道prolog不适合这样的操作,但可以这样做吗?
答案 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。