我正在处理 Prolog (eclipse) 中的一个场景,其中我需要重新格式化列表结构。
我有一个表格列表:
MyList = [a,b,c].
我试图查看是否可以将列表展平为单个元素,并将所有逗号替换为 + 运算符。
所以我的结果列表看起来像:
ResultList = [a+b+c]
这是一个单元素列表。初始列表的长度是任意的。
我知道 prolog 不适合此类操作,但是可以这样做吗?
在这里,在标准 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).
这可能会有所帮助
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)]
这个非递归版本怎么样..
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。