Prolog将数学表达式转换成列表?

时间:2016-11-20 13:41:48

标签: prolog

我试图转换mathematica表达式,例如 2x * y + 5z 到prolog中的单个元素列表,但是谓词

atom_codes(2x*y+5z, Codes)

给出

ERROR: atom_codes/2: Type error: `atom' expected, found `2x*y+5z' (a compound)

那么如何将表达式作为列表阅读呢?

1 个答案:

答案 0 :(得分:0)

正如其他评论所指出的,2x*y+5z不是原子。这也不是一个有效的Prolog术语,因为2x不是一个有效的术语。如果你把它写成2*x*y+5*z,它将是一个Prolog术语,表示表达式的语法树。

所以问题是2x*y+5z来自哪里以及你想用它做什么。你建议它来自Mathematica;你想解析一些Mathematica输出吗?如果是,您可以将其读取到代码列表并将其转换为原子和/或字符列表,这些更好看:

?- read_line_to_codes(user_input, Codes), atom_codes(Atom, Codes), atom_chars(Atom, Chars).
|: 2x*y+5z
Codes = [50, 120, 42, 121, 43, 53, 122],
Atom = '2x*y+5z',
Chars = ['2', x, *, y, +, '5', z].

如果要从中恢复语法树,则必须编写解析器。为此,请查看明确的子句语法(DCG)。