将英语翻译成C的序言 [英] Prolog- translating English to C

查看:100
本文介绍了将英语翻译成C的序言的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们在理论上理解一个相对简单的任务,但我想我只是不太了解Prolog的语法,无法将其转化为代码.基本上,我们有一个表示C语言中操作的英语符号的列表.当它们传递给我们的Prolog程序时,它们会存储为一个列表.例如:

We have a relatively simple assignment that I understand in theory but I think I just don't quite understand Prolog's syntax enough to get that into code. Basically, we have a list of English notations that represent operations in C. They're stored as a list when they're passed to our Prolog program. For example:

add 4 to 3

[add, 4, to, 3]

我们需要编写一个函数,该函数接受该列表并返回等效项.所以如果我打电话

We need to write a function that takes that list an returns the equivalent. So if I called

english2C([add,4,to,3], C).
C = 4+3

它将C绑定到结果.因此,数据结构本身将类似于+(4(3)).我们列出了必须翻译的此类英语符号,因此这是一个有限的数字.好像我们不必考虑所有可能性.还有一些组合,它们将两个操作合并在一起(之间用逗号隔开)

It would bind C to the result. So the data structure itself would be something like +(4(3)). We have a list of such English notation we have to translate, so it's a finite number. It's not like we have to account for all possibilities. There are also combinations, where they take two operations and combine them (with a comma in between)

english2C([add,3,to,5,',',then,subtract,7], C).
C = 3+5-7

我对如何开始感到有些困惑.我知道我可以使用列表的第一个元素,而该元素将始终是运算符(+,-,*等),然后可以递归地遍历列表以查找操作数.问题在于某些东西需要操作顺序,例如加3到5然后乘以4",它应该表示为(3 + 5)* 4,但是如果直接翻译它,则会得到3 + 5 * 4

I'm just somewhat confused as to how to start. I know I can take the very first element of the list and that will always be an operator (+,-,*, etc etc) and then I can just recursively go through the list looking for the operands. The problem there is for things that require order of operations, like "add 3 to 5 then multiply by 4", which should be represented as (3+5)*4 but if you just translate it directly you get 3+5*4.

哦,我们必须看看是否可以让它向后运行(给它一个C语句(3 + 5)并翻译回英语(加3到5)).那部分我根本没有任何想法.

Oh and we have to see if we can get it to run backwards (give it a C statement (3+5) and translate back to english (add 3 to 5)). That part I don't really have an idea for at all.

可能的英语符号有足够多的排列,我不能仅对所有内容进行模式匹配.我知道我需要做的是将第一个运算符与其对应的算术符号匹配,然后找到操作数.对于组合语句,这将是第一部分(因此我将拥有3 + 5),然后在下一个语句后面将有一个逗号.顺便说一句,组合语句可以随心所欲,因此,不仅仅是两个语句,而且我已经完成了.

There's a large enough permutations of possible English notations that I can't just pattern match everything. I get the idea that what I need to do is match the first operator with it's corresponding arithmetic symbol then find the operands. For a combinational statement, that would be the first part (so I would have 3+5) and then there would be a comma followed by the next statement. By the way, the combinational statements can be as long as they want, so it's not just two statements and I'm done.

推荐答案

如果存在少量合理的模式,则可以执行以下操作:

If there is a reasonable small number of patterns, you could do:

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进行匹配,它也可以向后"工作.

Those rules above compute the value. To translate, we can use DCG for matching, it's working 'backwards' as well.

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

编辑抱歉,我忘了减价.加上这个,我得到

edit sorry, I forgot a cut. With that added, I get

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

这是一个单点更改:您希望自己找到它吗?

It's a single point change: do you prefer to find it yourself?

这篇关于将英语翻译成C的序言的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆