我正在尝试在Isabelle中编写一个函数来完成赋值中的某些任务 我想确保我的功能正常工作,所以我想到了 用SML测试它,但我似乎无法弄清楚如何编写它。一世 从来没有使用/写过/学过函数式编程所以我遇到了一些麻烦 用它。有人可以帮助我,或者如果Isabelle有关于测试的内容 一个函数如何工作可以指出我正确的方向?
功能如下,基本上是删除第一次出现的 列表中的元素并从列表中删除所有匹配项
fun del1:: "'a ⇒ 'a list ⇒ 'a list" where
"del1 a Nil = Nil" |
"del1 a (x#xs) = (if x = a then xs else x#(del1 a xs))"
fun delall:: "'a ⇒ 'a list ⇒ 'a list" where
"delall a Nil = Nil" |
"delall a (x#xs) = (if x = a then (delall a xs) else x#(delall a xs))"
答案 0 :(得分:3)
我不确定我是否得到你的问题。首先,Isabelle / HOL和SML的语法不是非常不同。如果您只想在SML中获取函数的变体,可能最快的方法是使用Isabelle的代码生成器
export_code del1 delall in SML
会产生类似
的内容fun del1 A_ a [] = []
| del1 A_ a (x :: xs) = (if HOL.eq A_ x a then xs else x :: del1 A_ a xs);
fun delall A_ a [] = []
| delall A_ a (x :: xs) =
(if HOL.eq A_ x a then delall A_ a xs else x :: delall A_ a xs);
然而,由于这包含一些Isabelle特定的东西(比如字体构造以摆脱类型类),你可能更喜欢手写代码:
fun del1 a [] = []
| del1 a (x::xs) = if x = a then xs else x :: (del1 a xs)
fun delall a [] = []
| delall a (x::xs) = if x = a then delall a xs else x :: delall a xs
另一方面,如果您只是想在某些输入上试用您的功能,您可以使用value
在Isabelle中执行此操作。如,
value "del1 (2::nat) [1, 2 , 3]"
value "delall ''x'' [''x'', ''y'', ''z'', ''q'', ''x'']"
答案 1 :(得分:1)
Chris没有什么可以补充的答案,只有这个细节:在Isabelle2013-2中,Isabelle / jEdit文档面板有一些快速入门的例子。这包括src/HOL/ex/ML.thy
,它显示了一点Isabelle / HOL作为逻辑语言,SML作为函数语言,以及它们之间的一些连接。