【发布时间】:2015-12-16 21:02:39
【问题描述】:
我有以下递归函数,它在 VDM 中创建一个 0 列表(即 [0,...,0])。如何使用fun-where翻译到Isabelle?
VDM:
NewList: nat1 * seq of nat -> seq of nat
NewList(n, l) ==
if len l = n then l
else NewList(n, l ^ [0])
-- pre/post-conditions excluded here
由于我对 Isabelle 缺乏了解,我的尝试大错特错(但下面至少证明我尝试过......)。
伊莎贝尔:
fun
NewList:: "N ⇒ (VDMNat VDMSeq) ⇒ (VDMNat VDMSeq)"
where
"NewList n [] = NewList n [0]"
| "NewList n [x] = (if len [x] = n then [x] else NewList n (x#[0]))"
| "NewList n (x # xs) = (if len (x # xs) = n then (x # xs) else NewList n ((x # xs) # [(0::VDMNat)]))"
*数据类型 VDMNat 和 VDMSeq 在某些库中定义。请暂时忽略 VDMNat 和 VDMSeq - 欢迎使用 Isabelle 数据类型的任何类型的实现(至少它会为我的实现提供一个很好的参考)。请参阅 VDM 代码了解预期的数据类型。
您能否解释一下x、xs 和(x # xs) 指的是什么?我在几个递归函数示例中看到了这一点(尽管没有一个对我有帮助)。
感谢您的帮助!
【问题讨论】:
-
您真正要问的是:如何编写一个函数 - 给定一个数字
n- 返回一个n零列表? (在您的尝试中似乎是这样)。否则,您的 VDM 示例中的scoreboard是什么。你指的是哪个库来定义 VMDNat 和 VDMSeq? -
道歉 -
scoreboard应该是 l(现已更正)。是的,这就是我需要的:返回一个由 n 个零组成的序列。我正在尝试将我的 VDM 功能转换为 Isabelle。请暂时忽略 VDMNat 和 VDMSeq - 欢迎使用 Isabelle 数据类型的任何类型的实现(至少它会为我的实现提供一个很好的参考)。谢谢,克里斯!