使用Racket中的关联属性重新排序括号

时间:2018-04-16 19:03:29

标签: racket parentheses associativity

我在实现给出类似这样的函数时遇到了麻烦:

'((+(d + e) + f) + (a + (a + c))

返回:

'(d + (e + (f + (a + (a + c)))))

现在问题是我必须使用关联性来获得答案,所以我只想使用这个属性:

'((a + b) + c) = '(a + (b + c))

获得正确的输出。我知道如何实现这种情况的功能:

'((a + b) + c) -> '(a + (b + c))

但是我似乎无法弄清楚如何在上面的第一个案例(或任何其他大于三个案例的案例)中实施它。我不是只寻求一些指导的答案。如果你想看到代码片段让我知道,我可以发布一些。另外,我创建了一个从列表中去掉“+”以使其更容易处理的函数。

我认为这定义了语法:

var ::=  a | b | c | d | e | f | g
fpip ::= var | (fpip + fpip)

有效的fpip可以是:

fpip = '((a + b) + c)

fpip = '((a + b) + (c + d))

并且处于最原子级别:

fpip = '(a + b)

编辑:是的,初始的'+应该被删除。无论初始输入中有多少加号,输出中应该只有(量的 - 1)'+。例如:

'(+ + + + (a + b) + + c) -> '(a + (b + c)

1 个答案:

答案 0 :(得分:1)

我认为这些是需要考虑的案例。让我们调用递归重写器REWRITE。

var                               -> var
(var + var)                       -> (var + var)
(var + (fip1 + fpip2))            -> (var + (REWRITE (fip1 + fpip2))
((fip1 + fpip2) + var)            -> (REWRITE (fip1 + (fip2 + var))
((fip1 + fpip2) + (fip3 + fpip4)) -> (REWRITE (fip1 + (fip2 + (fip3 + fip4))))