【问题标题】:arithmetic operations on list elements in prologprolog中列表元素的算术运算
【发布时间】:2020-07-16 23:24:27
【问题描述】:

我在 Prolog 中得到了这个任务,但我不知道如何处理它。

我必须编写谓词expression(List,Outcome,Result),它使用List 中的每个元素构建一个算术表达式。它给出了一个Result,它在回溯之前必须等于Outcome

例如:

?- expression([1, 2, 3, 4], 2, X).
X = 1+ (2+ (3-4))

?- expression([1, 2, 3, 4, 5], 2, X).
X = 1+ ((2-3)*4+5)

我尝试过这样的事情:

operation(A, B, A + B).
operation(A, B, A - B).
operation(A, B, A * B).
operation(A, B, A div B).

expression([],_,_).
expression([A,B,D|List],Outcome,Result) :-
    operation(A,B,C),
    operation(C,D,Result),
    Outcome is Result.

这适用于三个元素的列表,但我想将它用于不同大小的列表。我假设我必须使用递归,但是如何?以及如何增加使用括号的可能性?

【问题讨论】:

    标签: list recursion prolog expression


    【解决方案1】:

    每个表达式都是一棵树。它的叶子的 fringe 总是相同的列表 - 给定的第一个参数。它的结构反映了括号。然后对于每棵树,它的节点——当“从上面看”时——形成一个算术二元运算符列表。对于每棵树,您需要考虑这些运算符的所有组合。

    expression( List, Result, Xpr ) :-
       tree( List, T, Nodes ),              % N elts in List, N-1 in Nodes
       combinations( Nodes, [+,-,*,/] ),    % or whatever ops you want to use
       evaluate( T, Result ),
       parenthesized( T, Xpr ).
    
    combinations( Nodes, Ops ) :-           % use_module( library( lambda )).
       maplist( \X^(member(X, Ops)), Nodes ).
    

    剩下的就是实现剩下的实现。

    【讨论】:

      猜你喜欢
      • 2019-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-25
      • 1970-01-01
      • 2015-06-02
      • 2012-02-26
      • 1970-01-01
      相关资源
      最近更新 更多