【问题标题】:flatten list by replacing comma with plus operator inside a list in prolog通过在序言中的列表中用加号运算符替换逗号来展平列表
【发布时间】:2012-03-27 23:48:57
【问题描述】:

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

我有一个表格列表:

MyList = [a,b,c].

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

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

ResultList = [a+b+c] 

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

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

【问题讨论】:

    标签: list prolog logic flatten


    【解决方案1】:

    在这里,在标准 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).
    

    【讨论】:

    • 谢谢。正是我想要的。
    • @chac list_to_op([3],Op) 失败。有意?
    • @chac:我宁愿写list_to_op([X],X).
    【解决方案2】:

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

    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。

    【讨论】:

      【解决方案3】:

      这可能会有所帮助

      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)]

      【讨论】:

      • 与我过去几个月编写和使用的内容几乎相同(除了谓词和参数名称)。由于 + 是一个中缀运算符,当写入来自 flatten_list_inner/2 的复合项时,会出现那些讨厌的括号。但是这些术语可以通过 is/2 来计算(如果原子 a,b,c 被数字替换)。
      猜你喜欢
      • 1970-01-01
      • 2011-05-29
      • 2022-11-29
      • 1970-01-01
      • 2022-11-30
      • 2020-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多