我们有一个相对简单的任务,我在理论上理解,但我认为我只是不太理解 Prolog 的语法,不足以将其写入代码。基本上,我们有一个表示 C 中操作的英文符号列表。当它们被传递给我们的 Prolog 程序时,它们被存储为一个列表。例如:
add 4 to 3
是
[add, 4, to, 3]
我们需要编写一个函数来获取该列表并返回等效项。所以如果我打电话
english2C([add,4,to,3], C).
C = 4+3
它将 C 绑定到结果。所以数据结构本身类似于 +(4(3))。我们有一个我们必须翻译的英语符号的列表,所以它是一个有限的数字。我们不必考虑所有可能性。还有组合,它们采用两个操作并将它们组合起来(中间有逗号)
english2C([add,3,to,5,',',then,subtract,7], C).
C = 3+5-7
我只是有点困惑如何开始。我知道我可以获取列表的第一个元素,它始终是一个运算符(+、-、* 等),然后我可以递归地遍历列表以查找操作数。问题在于需要操作顺序的事物,例如“将 3 加到 5 然后乘以 4”,它应该表示为 (3+5)*4 但如果你直接翻译它,你会得到 3+5*4 .
哦,我们必须看看我们是否可以让它向后运行(给它一个 C 语句(3+5)并翻译回英文(添加 3 到 5))。那部分我真的一点想法都没有。
编辑:有足够大的可能的英文符号排列,我不能只是模式匹配所有内容。我知道我需要做的是将第一个运算符与其相应的算术符号匹配,然后找到操作数。对于组合语句,这将是第一部分(所以我会有 3+5),然后会有一个逗号,然后是下一个语句。顺便说一句,组合语句可以随心所欲,所以不仅仅是两个语句,我已经完成了。