Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Racket中的关联属性对括号重新排序_Racket_Parentheses_Associativity - Fatal编程技术网

使用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))))