Prolog-将英语翻译成C语言

时间:2012-11-06 18:27:16

标签: list prolog nlp dcg

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

1 个答案:

答案 0 :(得分:2)

如果模式数量合理,可以这样做:

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)
...

这是一个单点改变:你更愿意自己找到它吗?