什么是级联术语,它们在什么上下文中是意外的?



我的主要问题是"意想不到的串联术语"是什么。我对下面的错误有一些背景,尽管似乎还有许多其他问题可能会混淆这个问题。

我有一个fooMap的术语和一个barMap类型的术语。foo获取表达式列表,目标是将它们全部放入Map中。为此,对于每个表达式,我调用bar并连接它。从Map的语法来看,我相信然后说bar(exp) foo(exps)就可以得到整个Map

这编译得很好,但是当我尝试在重写后立即运行它时bar(exp) foo(exps)我得到一个[Error] Critical: unexpected concatenated termfoo(...) while evaluating function _Map_.为了简洁起见,我删除了表达式本身。

我相信问题可能在于Map联合的优先级高于我的foobar,所以我尝试将bar分配为函数,但由于bar参数严格,这导致了排序错误KItemExp不兼容。

@ALee我们需要查看您的代码才能确定,但我认为这里的混淆是您试图将两个地图合并在一起,而 K 实际上不支持地图联合。

我们有构造函数_Map_,例如,它可以让您构建如下所示的Map"a" |-> 3 "b" |-> 4.但是,您不能采用两个任意映射并使用此构造函数将它们放在一起。

这样做的原因是生成的术语可能没有明确定义(如果两个映射定义相同的键,但具有不同的值怎么办?

相反,如果需要此行为,则需要编写自己的映射联合运算符,该运算符可以选择在两个映射中存在重叠键时执行的操作。此示例首选第二个Map参数中的键(如果存在相同的键,则覆盖第一个映射的值(:

syntax Map ::= union ( Map , Map ) [function]
rule union(M, .Map) => M
rule union(M, K |-> V M') => union(M [ K <- V ], M')

最新更新