gpt4 book ai didi

isabelle - 在 Isabelle 中定义常量之间的函数

转载 作者:行者123 更新时间:2023-12-01 00:40:49 27 4
gpt4 key购买 nike

我是一名刚开始习惯 Isabelle 的数学家,而本应非常简单的事情却令人沮丧。如何定义两个常量之间的函数?比如说,函数 f: {1,2,3}\to {1,2,4} 映射 1 到 1、2 到 4 和 3 到 2?

我想我设法将集合定义为常量 t1 和 t2 ,但(我猜因为它们不是数据类型)我不能尝试类似的东西

    definition f ::"t1 => t2" where 
"f 1 = 1" |
"f 2 = 4" |
"f 3 = 2"

我相信这个困难背后一定有一个根本的误解,所以我感谢任何指导。

最佳答案

你的问题有很多方面。

首先,为了让某些事情快速运行,请使用 fun关键字而不是 definition ,像这样:

fun test :: "nat ⇒ nat" where
"test (Suc 0) = 1" |
"test (Suc (Suc 0)) = 4" |
"test (Suc (Suc (Suc 0))) = 2" |
"test _ = undefined"

您不能使用 definition 直接在定义的头部对任何参数进行模式匹配。关键字,而您可以使用 fun .另请注意,我已将重载的数字文字(1、2、3 等)替换为 nat 的构造函数。模式匹配中的数据类型( 0Suc )。

另一种选择是坚持使用 definition ,但使用 case 将函数参数的大小写分析推送到定义主体内声明,像这样:
definition test2 :: "nat ⇒ nat" where
"test2 x ≡
case x of
(Suc 0) ⇒ 1
| (Suc (Suc 0)) ⇒ 4
| (Suc (Suc (Suc 0))) ⇒ 2
| _ ⇒ undefined"

请注意像 test2 这样的定义默认情况下,简化器不会展开,您需要手动添加定理 test2_def如果要扩展 test2 的出现次数,请转到简化程序的 simpset在一个证明中。

您还可以使用 typedef 定义与您的两个三元素集相对应的新类型(您不能直接使用集合作为类型,就像您尝试做的那样) ,但我个人会坚持使用 nat .

编辑:使用 typedef ,做这样的事情:
typedef t1 = "{x::nat. x = 1 ∨ x = 2 ∨ x = 3}"
by auto

definition test :: "t1 ⇒ t1" where
"test x ≡
case (Rep_t1 x) of
| Suc 0 ⇒ Abs_t1 1
| Suc (Suc 0) ⇒ Abs_t1 4
| Suc (Suc (Suc 0)) ⇒ Abs_t1 2"

不过,我真的从不使用 typedef我自己,所以这可能不是使用它的最佳方式,其他人可能会建议其他方式。什么 typedef do 是通过为新类型识别一组非空的居民,从现有类型中开辟出一种新类型。证明义务,这里由 auto 关闭, 只是为了证明新类型的定义集确实是非空的,在这种情况下,我将自然数的三元素集雕刻成一个新类型,称为 t1 ,所以证明相当简单。创建了两个新常量, Abs_t1Rep_t1这允许您在自然和新类型之间来回移动。如果您输入 print_theoremstypedef命令你会看到几个关于 t1 的新定理Isabelle 为您自动生成的。

关于isabelle - 在 Isabelle 中定义常量之间的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37941526/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com