【发布时间】:2013-04-29 04:09:53
【问题描述】:
假设我有一个二元运算符f :: "sT => sT => sT"。我想定义 f 以便它为克莱因四组实现一个 4x4 乘法表,在 Wiki 上显示:
http://en.wikipedia.org/wiki/Klein_four-group
在这里,我要做的只是创建一个包含 16 个条目的表。首先,我这样定义四个常量:
consts
k_1::sT
k_a::sT
k_b::sT
k_ab::sT
然后我定义我的函数来实现表中的 16 个条目:
k_1 * k_1 = k_1
k_1 * k_a = k_a
...
k_ab * k_ab = k_1
我不知道如何在 Isar 中进行任何类似正常的编程,并且我在 Isabelle 用户的列表中看到,据说(某些)类似编程的结构在语言中被有意淡化了.
前几天,我试图创建一个简单的、人为的函数,在源文件中找到if, then, else 的用法后,我在isar-ref.pdf 中找不到对这些命令的引用。
在看教程时,我看到definition 用于以简单的方式定义函数,除此之外,我只看到有关递归和归纳函数的信息,这需要datatype,而我的情况比那个。
如果留给我自己的设备,我想我会尝试为上面显示的这 4 个常量定义一个 datatype,然后创建一些转换函数,以便最终得到一个二元运算符 f :: sT => sT => sT。我在尝试使用 fun 时有点搞砸了,但这并不是一件简单的事情。
我对@987654338@ 和inductive 做了一些试验
更新:我在这里添加了一些材料来回应评论告诉我Programming and Proving 是我可以找到答案的地方。看来我可能会误入理想的 Stackoverflow 格式。
我做了一些基本的实验,主要是fun,还有inductive。我很快就放弃了归纳法。这是我从简单示例中得到的错误类型:
consts
k1::sT
inductive k4gI :: "sT => sT => sT" where
"k4gI k1 k1 = k1"
--"OUTPUT ERROR:"
--{*Proofs for inductive predicate(s) "k4gI"
Ill-formed introduction rule ""
((k4gI k1 k1) = k1)
Conclusion of introduction rule must be an inductive predicate
*}
我的乘法表不是归纳式的,所以我没有看到 inductive 是我应该花时间去追逐的。
“模式匹配”在这里似乎是一个关键思想,所以我尝试了fun。下面是一些非常混乱的代码,试图仅使用标准函数类型来使用 fun:
consts
k1::sT
fun k4gF :: "sT => sT => sT" where
"k4gF k1 k1 = k1"
--"OUTPUT ERROR:"
--"Malformed definition:
Non-constructor pattern not allowed in sequential mode.
((k4gF k1 k1) = k1)"
我遇到了这种错误,我在Programming and Proving 中读过类似的内容:
“递归函数是用fun通过数据类型构造函数的模式匹配来定义的。
这一切都让新手觉得fun 需要datatype。至于它的老大哥function,我不知道。
似乎在这里,我只需要一个包含 16 个基本情况的递归函数,这将定义我的乘法表。
function 是答案吗?
在编辑这个问题时,我想起了过去的 function,这是工作中的 function:
consts
k1::sT
function k4gF :: "sT => sT => sT" where
"k4gF k1 k1 = k1"
try
try 的输出告诉我它可以被证明(更新:我认为它实际上告诉我只有 1 个证明步骤可以被证明。):
Trying "solve_direct", "quickcheck", "try0", "sledgehammer", and "nitpick"...
Timestamp: 00:47:27.
solve_direct: (((k1, k1) = (k1, k1)) ⟹ (k1 = k1)) can be solved directly with
HOL.arg_cong: ((?x = ?y) ⟹ ((?f ?x) = (?f ?y))) [name "HOL.arg_cong", kind "lemma"]
HOL.refl: (?t = ?t) [name "HOL.refl"]
MFZ.HOL⇣'eq⇣'is⇣'reflexive: (?r = ?r) [name "MFZ.HOL⇣'eq⇣'is⇣'reflexive", kind "theorem"]
MFZ.HOL_eq_is_reflexive: (?r = ?r) [name "MFZ.HOL_eq_is_reflexive", kind "lemma"]
Product_Type.Pair_inject:
(⟦((?a, ?b) = (?a', ?b')); (⟦(?a = ?a'); (?b = ?b')⟧ ⟹ ?R)⟧ ⟹ ?R)
[name "Product_Type.Pair_inject", kind "lemma"]
我不知道那是什么意思。我只知道function 因为试图证明不一致。我只知道它没有抱怨那么多。如果像这样使用function 是我定义乘法表的方式,那我很高兴。
不过,作为一个爱争论的类型,我没有在教程中了解function。几个月前我在参考手册中了解到它,但我仍然不太了解如何使用它。
我有一个function,我用auto 证明了它,但幸运的是,这个功能可能不好。这增加了function 的神秘感。 Defining Recursive Functions in Isabelle/HOL中有function的信息,比较fun和function。
但是,我还没有看到不使用递归数据类型的fun 或function 示例,例如nat 或'a list。也许我看起来不够努力。
很抱歉,这不是一个直接的问题,但没有任何关于 Isabelle 的教程可以将一个人直接从 A 带到 B。
【问题讨论】:
-
一些cmets(对不起,它们与您的主要问题没有真正的关系):首先,Isabelle / HOL根本没有强调编程,实际上HOL通常被描述为“函数式编程+逻辑”;其次,递归函数和
inductive都不需要数据类型。两者都是通用结构。如果您对在 HOL 中编程感兴趣,一个很好的起点是 Programming and Proving in Isabelle/HOL。 -
@Chris,我想措辞选择错误。如果它很重要,我可以编辑它。与 Coq 相比,Makarius 说某些构造被故意排除在 Isar 之外。我的看法是,它迫使一个人以某种方式工作,我认为总体上更好。 prog-prove.pdf 的第 14 页:“递归函数是用 fun 通过数据类型构造函数上的模式匹配来定义的。” 并不是我不相信你@ 987654369@ 不是必需的,我不需要阅读该 PDF,但我不希望在该 PDF 中找到可以用作即插即用示例的示例。
-
字符用完。我不知道除了
datatype之外还需要什么才能让fun开心。在我看来,我需要的只是一些简单的模式匹配。我所有的基本实验和浏览文档什么都没做,只是给我的印象是fun需要一个归纳数据类型,因为它确实递归。我在基本文档中读到的所有内容,就模式匹配而言,都强调了fun、inductive和datatype之间的联系。知道datatype不是必需的会有所帮助,但在哪里学习不使用datatype的基础知识并不明显。 -
@chris,你会弄错吗? PDF 的 14 页标题为“编程和证明”并没有接近解决“一般结构”,只有
fun和datatype的魔力?查看 Haskell,根据this page,新的 Haskell 类型要求在创建时定义它。 Isar 允许带有typedecl的任意未定义类型,以及带有consts的任意常量。如果有人不想回答问题,这是可以理解的,但经常为每个“初学者问题”指向 57 pg PDF 并没有多大帮助。 -
指向“编程和证明”的指针是为了我的第一条评论(即表明编程在 Isabelle/HOL 中根本不被重视)。独立地,通读(不仅仅是肤浅地阅读)可用文档非常重要,这样才能对 Isabelle/HOL 概念有基本的理解和词汇。此外,关于 SO 的答案也应该对以后的读者有所帮助。这就是为什么指向正确文档的常规指针是有意义的。