根据codegen文档部分“7.3语言环境和解释”,从语言环境导出代码有点棘手但可以实现。以下示例正常工作:
locale localTest =
fixes A :: "string"
begin
fun concatA :: "string ⇒ string" where "concatA x = x@A"
definition concatAA :: "string ⇒ string" where "concatAA x = x@A@A"
end
definition localtest_concatA :: "string ⇒ string " where
[code del]: "localtest_concatA = localTest.concatA ''a''"
definition localtest_concatAA :: "string ⇒ string " where
[code del]: "localtest_concatAA = localTest.concatAA ''a''"
interpretation localTest "''a''"
where "localTest.concatA ''a'' = localtest_concatA"
and "localTest.concatAA ''a'' = localtest_concatAA"
apply unfold_locales
apply(simp_all add: localtest_concatA_def localtest_concatAA_def)
done
export_code localtest_concatA localtest_concatAA in Scala file -
如何为具有多个参数的区域设置导出代码?鉴于以下locale
:
locale localTest =
fixes A :: "string"
fixes B :: "string"
begin
fun concatA :: "string ⇒ string" where "concatA x = x@A"
definition concatB :: "string ⇒ string" where "concatB x = x@B"
end
我可以用
来解释它interpretation localTest "''a''" "''b''" .
但我可以在定义中使用这种解释
definition localtest_concatA :: "string ⇒ string " where
[code del]: "localtest_concatA = localTest.concatA ''a'' ''b''"
失败了
Type unification failed: Clash of types "_ list" and "_ ⇒ _"
Type error in application: incompatible operand type
Operator: op = localtest_concatA :: (char list ⇒ char list) ⇒ bool
Operand: localTest.concatA ''a'' ''b'' :: char list
答案 0 :(得分:2)
查看引入的常量,例如term
命令。我们有
term localTest.concatA
带输出
"localTest.concatA" :: "char list ⇒ char list ⇒ char list"
除了您在原始定义中(在语言环境中)中提供的单个参数之外,您还会看到另外一个参数(但只有1个而不是2个,因为定义不依赖于B
)
现在,在您的解释之后(因为您没有明确提供名称,localTest
的常量将在没有限定符的范围内)我们有
term concatA
带输出
"localTest.concatA ''a''" :: "char list ⇒ char list"
也就是说,localTest.concatA ''a''
已经是string => string
类型。您还要添加''b''
并获取类型string
,但您的类型注释会显示string => string
。所以真的存在类型的冲突,原因是你给localTest.concatA
提供了太多的论据。尝试使用
definition localtest_concatA :: "string ⇒ string " where
[code del]: "localtest_concatA = concatA
代替。