Prolog中的数学运算列表

时间:2018-03-23 07:20:20

标签: list prolog

我已经创建了一个数学表达式列表,例如[1,+,2,-,3],我试图将其评估为1+2-3 i.e 0。但是,我在实现这个方面遇到了麻烦。

以下是我尝试过的代码:

test(List, Atom) :-
    atomic_list_concat(List, '', Val),
    Atom is Val.

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

我认为你应该实现一个将给定列表转换为语法树的解析器。

你应该转换     [1,+,2, - ,3] 到      - (+(1,2),3)



    ?- A is -(+(1,2),3).
    A = 0.

Parser通常使用DCG开发。 您可以考虑运算符优先级(*强于+)以及树的扩展方向 I.E.你应该决定

[a,+,b,+,c] 

转换为

+(a,+(b,c))

+(+(A,B),C)

我很抱歉我的英语不好!

答案 1 :(得分:2)

使用atomic_list_concat的问题是结果是单个原子,而不是术语。所以Prolog并不知道如何执行"它使用is/2

您可以使用term_to_atom/2将原子转换为术语:

eval_exp(List, Result) :-
    atomic_list_concat(List, '', Atom),  % This relates a list to an atom
    term_to_atom(Term, Atom),            % This relates an atom to term
    Result is Term.                      % This evaluates a term