我已经创建了一个数学表达式列表,例如[1,+,2,-,3]
,我试图将其评估为1+2-3 i.e 0
。但是,我在实现这个方面遇到了麻烦。
以下是我尝试过的代码:
test(List, Atom) :-
atomic_list_concat(List, '', Val),
Atom is Val.
非常感谢任何帮助。
答案 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