使用Racket中的关联属性对括号重新排序
我在实现一个函数时遇到了问题,该函数给出了如下内容:使用Racket中的关联属性对括号重新排序,racket,parentheses,associativity,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)) 然而,对于上面的第一个案例(或任何
'((+(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)
编辑:是,应删除首字母“+”。无论初始输入中有多少个加号,输出中应该只有(变量数量-1)“+。例如:
'(+ + + + (a + b) + + c) -> '(a + (b + c)
我认为这些都是需要考虑的问题。让我们称之为递归重写器重写
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))))
你有输入语法的语法吗?我想我定义了语法,但如果没有,请纠正我。在你的示例中,你有
(+(d+e)…)
。第一个+
应该被擦除吗?(+++++(a+b)++c)
不是有效的fpip
。语法的全部意义在于严格,所以你不应该让它起作用。@Sylvester你是对的。首字母“+”是一个打字错误。
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))))