2

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

我有一个表格列表:

MyList = [a,b,c].

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

所以我的结果列表看起来像:

ResultList = [a+b+c] 

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

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

4

3 回答 3

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).
于 2012-03-11T08:41:52.660 回答
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)]

于 2012-03-11T04:59:12.410 回答
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。

于 2012-03-12T00:18:34.623 回答