我的主要问题是"意想不到的串联术语"是什么。我对下面的错误有一些背景,尽管似乎还有许多其他问题可能会混淆这个问题。
我有一个foo
Map
的术语和一个bar
Map
类型的术语。foo
获取表达式列表,目标是将它们全部放入Map
中。为此,对于每个表达式,我调用bar
并连接它。从Map
的语法来看,我相信然后说bar(exp) foo(exps)
就可以得到整个Map
。
这编译得很好,但是当我尝试在重写后立即运行它时bar(exp) foo(exps)
我得到一个[Error] Critical: unexpected concatenated termfoo(...) while evaluating function _Map_
.为了简洁起见,我删除了表达式本身。
我相信问题可能在于Map
联合的优先级高于我的foo
和bar
,所以我尝试将bar
分配为函数,但由于bar
参数严格,这导致了排序错误KItem
和Exp
不兼容。
@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')