如何在SML中编写此函数

时间:2014-02-01 18:09:38

标签: functional-programming sml isabelle

我正在尝试在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))"

2 个答案:

答案 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作为函数语言,以及它们之间的一些连接。

相关问题