我试图转换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)
那么如何将表达式作为列表阅读呢?
答案 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)。