我可以按如下方式合并两个有限贴图:
value "fmadd
(fmap_of_list [(1::nat,2::nat)])
(fmap_of_list [(2::nat,3::nat)])"
但当我尝试合并一组地图时:
value "ffold fmadd fmempty {|
fmap_of_list [(1::nat,2::nat)],
fmap_of_list [(2::nat,3::nat)]|}"
我得到以下错误:
Wellsortedness error:
T
我想知道在以下情况下如何重新安排目标:
lemma "P=Q"
proof (rule iffI, (*here I would like to swap goal order*), rule ccontr)
oops
我想要一个不需要改变引理语句的解决方案。我意识到,首选和延迟可用于应用样式的校对,但我希望有一种方法可用于校对(…)部分
编辑:
正如Andreas Lochbihler所说,在上面的示例中,编写规则iffI[旋转]是有效的。然而,在下面的情况下,在不改变引理的陈述的情况下
我怎样才能输入像这样的符号∈, ⊆, ∪, 及∩ 伊莎贝尔/杰迪特?Isabelle/HOL教程说,我应该输入“:”,“您可以键入\然后使用tab键选择所需符号,还可以使用上/下箭头键从选项中进行选择。当所需符号出现在建议符号列表的顶部时,我使用tab键
还有⊆, 我使用“(=”
Isabelle在证明陈述时是否支持自定义案例区分?假设我想证明所有自然数n的一个语句,但是证明完全不同,这取决于n是偶数还是奇数。有可能在一个证明中做这种区分吗
proof(cases n)
assume "n mod 2 = 0"
<proof>
next assume "n mod 2 = 1"
<proof>
qed
证明(案例n)
假设“n模2=0”
接下来假设“n mod 2=1”
量化宽松
到目前为止,我将引理/定理分成两个独
(第3.5节)通过提供缺失公理的证明,解释了如何定义“事实之后”的附加子类关系。当子类在公理之外添加参数时,有没有办法做到这一点
例如,假设我有以下类:
class setoid =
fixes eq :: "'a ⇒ 'a ⇒ bool" (infix "≈" 50)
assumes eq_refl : "∀x. x ≈ x"
and eq_symm : "∀x y. x ≈ y ⟶ y ≈ x"
and eq_trans : "∀x y z. x ≈ y ⟶ y ≈ z ⟶ x ≈ z"
我需要一个描述范围的列表,如:
[0..<length P]
但是,该类型具有nat列表。我以后需要它的类型是int list
如何进行这种转换?最简单的方法可能是映射int[0..还有List.upto,使用特殊语法[m..n]生成从m到n的整数列表,其中上界和下界都包含在内
所以在你的情况下,我可能会使用
[0 .. int (length xs) - 1]
注意,对于length的结果,仍然需要从nat转换为int
我正在尝试从FOL为Isabelle定义一个新的类型定义命令。这个新类型“T”应该具有sort“T::term”,但是我在纯文本中找不到任何这样做的函数
我遵循了HOL的typedef.ML中的思想
如果没有这种排序(默认排序),我将无法统一我定义的公理之间的排序
这是一个关于伊莎贝尔图书馆衍生工具概念的问题
我试图理解(f有_场_导数dx)(在S中的x处)的意思。我知道(在S中的x处)是一个过滤器,但直觉上我认为下面的陈述是正确的
lemma DERIV_at_within:
"(∀x ∈ S. (f has_field_derivative D x) (at x))
= (∀x. (f has_field_derivative D x) (at x within S))"
如果不是,我应该如何解释衍生工具中的(S中的x)。A中的x是x的指向
我正在阅读简介“”并尝试做练习2.2
目前我有以下几点:
theory Scratch
imports Main
begin
fun add:: "nat ⇒ nat ⇒ nat" where
"add 0 n = n" |
"add (Suc m) n = Suc(add m n)"
lemma add_02 [simp]: "add m 0 = m"
apply(induction m)
appl
我有一个与列表匹配的函数:
fun merge where
‹merge [] [] = []› |
‹merge (v#vs) [] = (v#vs)› |
‹merge [] (v#vs) = (v#vs)› |
‹merge (x#xs) (y#ys) =
(if x < y then x # merge xs (y#ys) else y # merge (x#xs) ys)›
问题是,我可以证明sorted(merge xs[])的这种情况,但这并不满足s
在~~/src/HOL/word/word.thy中有一个名为word\u rsplit的函数
definition word_rsplit :: "'a :: len0 word => 'b :: len word list" where
"word_rsplit w =
map word_of_int (bin_rsplit (len_of TYPE ('b)) (len_of TYPE ('a), uint w))"
我想把一个32字分成四个8字,这个功能似乎很完美
引理
如何在Isabelle中将集合转换为列表
我对函数定义感兴趣,其签名为:
"'a set => 'a list"
我如何定义它?在伊莎贝尔/杰迪特的查询面板的查找常量选项卡中搜索“'a set”“'a list”
sorted_list_of_set :: "'a set ⇒ 'a list"
从理论列表中。然而,该常数要求'a在类linorder中,即,它仅适用于线性有序元素上的集合。此外,正如我在评论中提到的,它只适用于有限集。在集合的sorted\u list\u定义的正上方还有
我是Isabelle/Hol的新用户,我对使用Isabelle中现有的定义感到有些困惑。我必须在我的模型中定义一个完整的晶格结构和完整的偏序(CPO)结构。我发现这些定义已经作为类存在于HOLCF Porder.Thy和Lattice.Thy中。所以,如果我想在我的模型中包含这些定义,我应该如何继续?像我复制粘贴所有的定义,还是有一个特定的命令
谢谢在您自己的理论标题中,您可以导入其他理论。完整的晶格已经存在于Main理论中(如果使用HOL,通常会导入)。可以使用~/src/HOL/…(Isab
我对Isabelle比较陌生,我对Isabelle附带的thy文件的组织结构感到困惑
为什么一些属于相同知识体系的文件在~~src/HOL中,而其他文件在~~src/HOL/中
例如,为什么GCD在~~src/HOL中,而不是在~~src/HOL/Number\u理论中
类似问题:ex文件夹与~~src/HOL中的Isar\u示例文件夹有什么区别?合并它们不是更自然吗
另外,Isabelle差不多30岁了,在那段时间里发生了很大的变化。例如,GCD.thy文件是12年前创建的,只提供常量GC
在Isabelle形式化中,我用二元谓词表示关系。我想让操作符使用这种表示来执行典型的关系操作,如合成和反转
文档“What's in Main”只提到了用成对集表示的运算符。关系理论一开始就说,“关系——作为成对集和二进制谓词”。然而,在这个理论中,我找不到对二进制谓词表示的太多支持。我只找到了几个具有神秘属性的引理
对二进制谓词表示的关系有广泛的支持吗?特别是,是否定义了公共关系操作的运算符?这些东西记录在哪里?对成对关系集的支持比二进制谓词稍微好一点,但有很多是可用的。然而,许多关系操作是
我对Isabelle有一个很长的了解,我想知道有多少行是定义,多少行是语句,多少行是注释
Isabelle中是否包含任何此类工具(例如coqwc for coq)?我已经阅读了Isabelle系统手册,但找不到任何相关内容
我试图证明以下引理:
lemma
fixes A B C D :: "((real, 3) vec, 3) vec"
and v m :: " (real, 3) vec"
assumes "∃ A. m = D ** A ** B *v v"
shows "∃ A. m = D ** B ** A *v v"
但由于∃ A.D**A**B*v=D**B**A*v可以直接证明。可能是因为∃ A!。有人能解释为什么伊莎贝尔/霍尔不能证明这一点吗?
谢谢
在做一些基本代数的时候,我经常会得到以下类型的子目标,有时是有限和,有时是有限积
lemma foo:
fixes N :: nat
fixes a :: "nat ⇒ nat"
shows "(a 0) = (∑x = 0..N. (if x = 0 then 1 else 0) * (a x))"
这对我来说似乎很明显,但是auto和auto-cong:sum.cong-split:if\u splits都不能处理这个问题。更重要的是,当
Isabelle有一个快速和脏模式,允许使用抱歉跳过校对。它在jEdit中默认启用,在isabelle build中默认禁用。如何更改设置
在jEdit中(以交互方式或使用命令行参数)
对于isabelle build,从命令行
对于isabelle build,分别在ROOT文件中
还有,有没有其他方法可以问伊莎贝尔,最好是在《绝地武士》中以互动的方式,“当前理论中的哪些引理及其父母已经用抱歉证明了?”
(我在这里问这个问题是希望总是有最新的答案,与我在谷歌上找到的一些邮件列表帖子形成对比
我试图表达一个函数f在一个集合S上是常数,其值r我的第一个想法是
f ` S = {r}
但这不起作用,因为S可以为空。因此,我目前正在与
f ` S ⊆ {r}
它工作正常,但我的印象是,对于标准自动化来说,这仍然不是理想的。特别是,auto将无法离开此目标(删除无关事实)
Sledgehammer当然没有问题(metis image\u eqI singletonD substece),但这种情况很少出现。(通常,⊆似乎不能像我预期的那样与auto一起工作)
有没有更好的方法来表达这一点
假设我有以下定理:
comm_group ⦇carrier = e_aff, mult = add, one = (1, 0)⦈
我想表明:
add (add (x1,y1) (x2,y2)) (i (x2,y2)) = (x1,y1)
其中i是组的逆运算。显然,这在一个群体中是成立的。如何从假设中提取这些知识?comm\u组…是区域设置谓词,即表明您实际拥有区域设置实例的内容。要实际使用它,通常需要解释语言环境:
interpret comm_group "⦇carrier = e_aff
我试图证明生成函数产生某些,仍然非常简单的模式。
模式_0_1生成交替0和1的列表。我已经成功地证明,对于任何长度大于0的列表,第一项都是零。然而,应用同样的技术无法证明第二个元素总是1。我猜这里根本不需要诱导。如果有人能帮我找到正确的方法来完成第二个引理,我将不胜感激
fun pattern_0_1 :: "nat ⇒ nat ⇒ nat list" where
"pattern_0_1 0 item = []" |
"pattern_0_1 len item = item # (patt
证明一个简单的定理时,我在证明中遇到了元层次的含义。拥有它们可以吗?还是可以避免?如果我要处理它们,这是正确的方式吗
theory Sandbox
imports Main
begin
lemma "(x::nat) > 0 ∨ x = 0"
proof (cases x)
assume "x = 0"
show "0 < x ∨ x = 0" by (auto)
next
have "x = Suc n ⟹ 0 < x" by (simp only: Nat.z
我正在尝试伊莎贝尔官方教程中的列表示例。我将#替换为:,将@替换为++,使其语法与Haskell相同。现在我收到了AST中关于歧义的警告。我知道我可以用hide_const隐藏函数,但这不适用于中缀表示法中的运算符。如何在Isabelle中隐藏运算符
确切的警告信息是:
Ambiguous input⌂ produces 2 parse trees:
("\<^const>HOL.Trueprop"
("\<^const>HOL.eq" ("\<^con
我通常认为也有这样的工作方式:
have "P r Q1" by simp
also have "... r Q2" by simp
also have "... r Q3" by simp
...
also have "... r Qn" by simp
finally have "P r Qn+1" by simp
其中,“…r Qm”表示“Qm-1 r Qm”,r是某种传递关系
对于r的意思是=,但在使用≥我发现了一个与此描述相反的例子:
...
have "1- 1/(2^(n+1)
为什么函数(类)的以下定义
定义不减损::“实数集=>(实数=>实数)=>bool”
其中“在SF上不减损”(所有x:S.所有y:S.x f x您可以在Isabelle/jEdit中看到
definition nondecreasing_on :: "real set => (real => real) => bool"
where "nondecreasing_on S f <-> (ALL x:S. ALL y:S. x<=y --> f x <
伊莎贝尔的健康错误是什么
我遇到了如下问题:
如何解决此问题?命令内部使用代码生成器进行评估,代码生成器会引发良好排序错误。在上述情况下,Isabelle的类型检查器为术语镜像类型推断出具有类型变量的类型,即'树,其中类型变量'a具有排序类型。由于'a tree可能包含'a的值,因此代码生成器还尝试生成用于漂亮打印'a tree的代码,该代码在的类型类术语中实现。但是,这失败了,因为'a的推断类型是类型,而不是术语,这是良好分类错误的原因
避免错误的最简单方法是显式地给出单态类型。比如说,
v
以下是我试图证明这一点的尝试:
这里有几个问题。首先,我应该在moore函数中返回一个三元组。现在,系统正在抱怨错误:
类型统一失败:类型“int”和“\u”冲突⇒ _"
应用程序中的类型错误:操作数类型不兼容
接线员:op≤ x::(int)⇒ int⇒ int)⇒ 布尔操作数:y::int
然后,当然终止证明不会成功,因为我没有应用上面的终止函数(方法应该类似于)
如何解决这个问题?首先,您的moore函数当前不返回一个三元组,而是一个包含两个ints并返回一个int的函数。对于三元组,您必
如何在Isabelle(2021)text命令中写入下标
我尝试使用符号(自动转换为向下箭头),如下所示:
text ‹
identity 1<^sub>S
›
我也尝试了LaTex方法,并使用下划线,但jEdit似乎不认识LaTex。您可以使用AntiVirtation文本:
text ‹
identity \<^text>‹1⇩S›
›
(*or simply*)
text‹identity ‹1⇩S››
在这种情况下,$1\u$应按预期显示在生成的LaTeX文档
梅蒂斯警告我:
Metis: Proof state contains the universal sort {}
("HOL/Tools/Metis/metis_tactic.ML")
这个警告是什么意思?
这是否表明metis证明比没有警告的情况下“更不可靠”?证明绝对可靠。我记得,这条消息主要对开发人员有价值,有助于诊断metis调用失败的原因。普通HOL目标不包含空排序
我猜这个警告已经过时了
apply style和Isar证明是否等效?这是一个我思考了一段时间的问题。当然,Isar证明更具可读性、可维护性和易写性(?),但我的问题是,你能否用这两种风格证明完全相同的东西
例如,我目前正在制作一个需要离开的证明:
apply(simp split: prod.splits)
using some_lemma by fastforce
应用和Isar样式中这些命令的等效形式是什么?实际上,我对Isar风格更感兴趣,因为有人告诉我混合风格是不好的风格。等效的Isar风格应该是:
ha
我是伊莎贝尔的新手,我试图证明这样的事情:
lemma refl_add_help: "[| n:nat; m:nat |] ==> 0 #+ n \<le> m #+ n"
by(rule add_le_mono1, simp)
theorem mult_le_self: "[| 0 < m; n:nat; m:nat |] ==> n \<le> n #* m"
apply(case_tac m, auto
如何阻止simp方法将元组拆分为其组件
示例。如果我写
fun foo where "foo z = blah z"
lemma "∃z :: nat × nat × nat × nat × nat. foo z"
证明状态为∃Zfoo z。如果我写
apply (simp)
证明状态变为∃a aa ab ac b。等等(a、aa、ab、ac、b)。我喜欢simp将foo扩展成blah,但我宁愿它保持变量z的原样。你必须从简化器中删除定理split_paired_Ex,如apply(sim
单值关系(如关系理论中的单值所定义)允许从隶属关系推导等式。我想知道是否有一种方法可以利用它重写目标中的术语(然后合并这些成员关系)
例如,如果没有辅助定理,自动或强制无法解决以下目标:
lemma
assumes "single_valued A"
assumes "(a,b) ∈ A" and "(a,b') ∈ A"
shows "b = b'"
using assms
by (metis single_valued_def)
在这里,平等直接体现在目标中,但在假设中重写也很
在《伊莎贝尔/杰迪特》中,有时我只想用一次性理论测试一些东西,而不想将其保存到磁盘。但是,当我创建一个新文件时(即使使用mode设置为isabelle的new in mode命令),缓冲区在我保存它之前不会被处理(使用适当的文件名)
有办法保存文件吗?这似乎是可能的,因为默认情况下,Isabelle/jEdit以一个空的划痕开始。您处理的文件,即使未保存。Isabelle/jEdit似乎使用缓冲区名称来决定是否处理理论(必须以.thy结尾)。据我所知,jEdit没有提供一种在不保存缓冲区的情况下
也许有人能帮我找到伊莎贝尔的解雇证明。我试图从列表A中构造一个新的子列表B。为了构造B,我一遍又一遍地阅读整个A。取出元素并使用结果搜索下一个元素。我设计了一个简单的例子来说明:
给定的是一个随机实数列表。如果列表中的一个项目大于P,那么我们说列表上有一个数字P
definition pointOnList :: "real list ⇒ real ⇒ bool" where
"pointOnList L P ≡ ∃ i. i < length L ∧ P < L!i"
现在我
我尝试为自定义数据类型创建自定义线性顺序失败,下面是我的代码:
theory Scratch
imports Main
begin
datatype st = Str "string"
fun solf_str_int:: "string ⇒ int" where
"solf_str_int str = (if (size str) > 0
then int(nat_of_char (hd str) + 1) + 100
我试图在Isabelle中建立一个非常简单的通信协议模型,当试图证明简化规则时,证明失败了。我不确定它想证明什么,或者我需要补充什么来帮助它。我还在学习伊莎贝尔,并逐渐习惯这个过程;我错过了什么?代码如下:
theory simple_prot
imports Main
begin
datatype Agent = Server | Friend nat
datatype Hi = ''HelloMessage''
datatype HiAck = ''HelloAck''
datatype
我的问题是关于《具体语义学》一书中的练习2.11:
在整数上的一个变量中定义算术表达式
(键入int)作为数据类型:
datatype exp = Var | Const int | Add exp exp | Mult exp exp
定义一个函数eval::exp=>int=>int,以便eval ex在
值x。
多项式可以表示为系数列表,从
常数例如,[4,2,-1,3]表示多项式4+2x-x^2+3x^3
定义一个函数evalp::int list=>int=>int,该函数在
给定的
我试图描述一种编程语言的类型系统。任何类型的VoidType都有一个公共子类型,任何类型的AnyType都有一个公共超类型:
datatype type =
VoidType |
AnyType |
BooleanType |
EBooleanType |
RealType |
IntegerType |
UnlimNatType |
StringType
fun subtype_strict_fun :: "type ⇒ type ⇒ bool" (infix
我正在学习“Isabelle食谱”,用Isabelle编写ML代码
不幸的是,许多示例都不起作用,因为找不到内置函数(名称已更改?是否应指定path structure.fct?)。
例如,使用etac、rtac和atac的示例不再有效。这些新名字是什么?我自己怎么找到它们的?伊莎贝尔食谱一直都是非正式的,我怀疑它现在已经严重过时了。这里有一些很好的信息,但“官方”的最新来源是《伊莎贝尔实施手册》
要查找已重命名事物的名称,通常可以查看新闻文件,例如,在本例中:
* Old tactic sho
以Isabelle中自然数不等式的以下定义为例:
inductive unequal :: "nat ⇒ nat ⇒ bool" where
zero_suc: "unequal 0 (Suc _)" |
suc_zero: "unequal (Suc _) 0" |
suc_suc: "unequal n m ⟹ unequal (Suc n) (Suc m)"
我想证明不等的的不可伸缩性,也就是说,不等的n。为了便于说明,让我首先证明人工引理,-不相等(n+m)(n+m):
我想证明一个函数/算法的正确性和终止性,该函数/算法将任何一阶逻辑公式转换为其否定范式NNF。
然而,我甚至不知道如何开始。有人能帮我吗
我曾尝试使用包FOL,但后来我意识到我不能同时导入Main以使用fun命令。然后我从Main开始,用blast证明了一些等价规则
现在我需要创建一个函数,将一阶公式转换为它的求反范式。我从这个开始:
有趣的托夫::道具==>道具在哪里
但这似乎不能正常工作,伊莎贝尔给了我一个信息:类型统一错误。这里有什么提示吗?在开始定义将一阶公式转换为NNF的函数之前,您可
我试图从它的文档中学习Isabelle符号和语法。特别是,我试图使用等价表示法(Isabelle 2020的main.pdf中的equiv)陈述一个引理
引理不一定有用,但我希望语法正确。我试着用以下内容来填补空白,希望说明平等是一种等价关系:
lemma "equiv nat (=)"
尝试未成功,并生成以下错误:
Type unification failed: Clash of types "_ ⇒ _" and "_ set"
我最近开始学习伊莎贝尔,但我找不到一个非常重要的问题的答案:如何看待伊莎贝尔发现的“证据”的逐步推理?我不满意像“自动”或“使用定理A”这样的行,我想检查一步一步的推导。
当然,我了解了Isar的“证据”,但是1。这样的Isar证明并不总是由Sledgehammer和2。即使是Isar证明也不总是给出一步一步的推理。例如,Sledgehammer生成的我的一个定理的Isar证明如下所示:
proof -
have "... here is my formula ...."
我正在学习伊莎贝尔教程。在第25页,它引用了素数的定义。我是这样写的:
definition prime :: "nat ⇒ bool" where "prime p ≡ 1 < p ∧ (∀m. m dvd p ⟶ m = 1 ∨ m = p)"
它给出了错误
Wellsortedness error
(in code equation prime ?p ≡
ord_nat_inst.less_nat on
如何证明这个基本引理?我对伊莎贝尔比较陌生,这个问题令人困惑。通过案例分析:
datatype aaa = A | B
lemma "(a ~= A) --> (a = B)"
另一个初学者尝试的策略是使用大锤。对于这种引理,它肯定会很快得到一个证明。
by (cases a, auto)
我定义了一个非常简单的面向对象模型。该模型定义了一组类和一组关联
nonterminal fmaplets and fmaplet
syntax
"_fmaplet" :: "['a, 'a] ⇒ fmaplet" ("_ /↦⇩f/ _")
"_fmaplets" :: "['a, 'a] ⇒ fmaplet" ("_ /[↦⇩f]/ _")
"" :: "fmaplet ⇒ fmaplets"
下面是一个具有确定性关系的示例数据类型
datatype ty1 = A | B | C ty1 | D ty1
inductive rel1 where
"rel1 A (C B)"
| "rel1 (C B) (D A)"
lemma rel1_det:
"rel1 x y ⟹ rel1 x z ⟹ y = z"
by (elim rel1.cases; auto)
我正试图为以下类型提升引理:
datatype 'a ty2 = E 'a | F 'a
abbrevia
有时在证明中,我发现自己需要累积结果,但也需要使用最后一个结果,因此我最终使用“,然后也使用””,用于此目的:
proof
have ...
also then have ...
also then have ...
ultimately show ...
qed
我觉得有更多我不知道的惯用方法。另一方面,这可能是标准的做法,并受到社区的鼓励
鉴于此,我有两个问题:
那么,使用“也不鼓励吗
如果是这样,我可以使用什么替代方法来累积结果
我将首先提供一些背景资料。你在《伊莎贝尔》
上一页 1 2 ...
9 10 11 12 13 14 15 ...
下一页 最后一页 共 17 页