Prolog-英语翻译到C(Prolog- translating English to C)

2019-08-02 09:15发布

我们有一个相对简单的任务,我在理论上理解,但我想我只是不太明白的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),然后会有一个逗号后面的下一条语句。 顺便说一句,组合语句可以,只要他们想要的,所以它不只是两个语句和我完成了。

Answer 1:

如果有图案合理的小数目,你可以这样做:

english2C([add,X,to,Y], R) :- R is X+Y.
english2C([add,A,to,B,',',then,subtract,C], R) :- R is A+B-C.

编辑

以上这些规则计算值。 要翻译,我们可以用DCG进行匹配,它的工作“倒退”为好。

english2C(In, R) :- phrase(toe(R), In, []).

toe(X+Y) --> [add,X,to,Y].
toe(X*Y) --> [multiply,X,by,Y].
toe(L-R) --> toe(L), [',',then,subtract,R].

测试:

?- english2C(X,3+6).
X = [add, 3, to, 6].

编辑对不起,我忘了削减。 与补充,我得到

?- english2C([add,3,to,5,',',then,subtract,4],X).
X = 3+5-4.

?- english2C(L,3+5-4).
L = [add, 3, to, 5, ',', then, subtract, 4].

没有,有在循环之后;

?- english2C([add,3,to,5,',',then,subtract,4],X).
X = 3+5-4 ;
^CAction (h for help) ? goals
[698,875] toe(_G2096630, [add, 3, to, 5, ',', then, subtract, 4], _G2096652)
[698,874] toe('<garbage_collected>', '<garbage_collected>', _G2096652)
...

这是一个单点变化:你喜欢自己找到了吗?



文章来源: Prolog- translating English to C