让我们假设我们正在处理一对类型('a×'a),并定义一个fun,为其进行模式匹配
fun test :: "('a × 'a) ⇒ 'a ⇒ bool" where "test (a,b) c = True"
如果我现在有一个类型为('a×'a)的变量a_b,我如何将其替换为应用样式证明中的成对表示形式(a,b)。例如,显示下列引理的最佳方式是什么?如何用测试(a,b)c替换测试a_b c
lemma "test a_b c = True"
这是否也适用于假设中的配对
lemma "¬ te
我试图得到两个多项式除法余数的系数的int列表。我一直试图在两个int poly类型的多项式上使用modfrompolymone.thy。但是,我得到了一个错误:
Type unification failed: No type arity int :: field
我的职能是:
fun testFunc :: "int poly ⇒ int poly ⇒ int list"
where
"testFunc p q = int_list (coeffs (p mod q))"
其中,in
我有下面的引理来证明f在x上的导数是D
lemma lm1:
assumes "(∀h. (f (x + h) - f x) = D*h)"
shows "DERIV f x :> D"
proof cases
assume notzero: "∀h. h ≠ 0"
have cs1: "(λh. (f (x + h) - f x) / h) -- 0 --> D" using assms notzero by auto
from this DERIV_def show ?the
在伊莎贝尔的新闻文件中,我发现
命令“typedef”现在可以在本地理论上下文中工作,而不需要
引入对参数或假设的依赖性,这不是
可能在伊莎贝尔/纯/荷尔。请注意,逻辑环境可能会
包含本地typedef的多种解释(具有不同的
非空性证明),即使是在全球理论背景下
(可追溯到伊莎贝尔2009-2年)。这是关于typedef和本地理论背景的最新消息吗?此外,“不引入对参数或假设的依赖”的限制实际上意味着什么
如果这意味着我不能在定义代码集中使用区域参数TyBuffs,那么我就不会考虑 TyBuffs
我这里的问题是一个切线的副产品
对于这些问题,我使用了一个非常简单的引理,尽管我的第二个问题相当复杂
当使用show或时,以及当我的所有逻辑都正确时,“Local statement无法细化任何待定目标”错误是一个更令人沮丧的错误,因此我试图更好地理解下面在引理修复2中出现的错误消息
我知道它的修复方法,这是我的引理修复1,但我知道的越多,我可能越擅长处理另一个“无法完善任何未决目标”的问题
任何感兴趣的人都可以通过阅读问题,然后看看这两个引理来回答Q1和Q2
我在下面放了很多信息。我将下面的注
我用instance+[]nat和instantiation+[]nat在src/HOL文件夹上做了一个grep,也许我找到了为nat实例化的所有类型类
由于我还需要了解int、rat和real是如何实例化的,因此如果有这样做的命令,比如print\u dependencies,它将显示类型类的依赖项,这将非常方便
下面,我显示了我在键入print\uu时通过查看命令完成下拉框找到的所有打印和可视化命令
我还显示了nat的实例化,我在根文件夹src/HOL的文件中找到了这些实例化,其中的章节与H
我发现自己经常想写这种形式的表达
let x = SOME x. x ∈ e1
in e2
就是,;让x成为e2中e1的任意成员。它相当冗长,而且必须绑定x两次似乎有点奇怪。有没有更简洁的方法来表达这一点?我检查了e2语法中的let x=e1()的处理方式,发现我可以复制该机制来提供一个新的let x∈ e2中的e1语法。这是我的代码(我刚刚把let改名为lett):
作为快速测试:
value "let x ∈ {2::int,3} in x+x"
我检查了e2语法中的let x=e1的
对于Isabelle来说,我是一个完全的初学者,我一定是做错了什么,因为以下看似简单的测试代码并不适合我:
theory testit
imports
"~~/src/HOL/Library/Inner_Product"
begin
thm inner_zero_left
typ "real_inner"
end
在jedit界面中,thm命令似乎工作正常(因此它在内部产品导入中看到了定理),但真正的内部类型不是。它在抱怨
Undefined type name: "real_
我对确定集合基数的函数的精确位置感到困惑。如果我看
在Cardinality.thy中找不到任何内容,但导入了Phantom_Type,然后导入Main,其中至少找到了card的缩写(但不是card本身的定义).只需按住ctrl键,点击Isabelle/jEdit中的“卡片”一词,您就可以直接进入有限集合中的定义。您的:
text ‹
The traditional definition
@{prop "card A ≡ LEAST n. ∃f. A = {f i |i. i <
例如,我需要为列表对定义一个数据类型,两个列表对的长度必须相同:
type_synonym list2 = "nat list × nat list"
definition good_list :: "list2" where
"good_list ≡ ([1,2],[3,4])"
definition bad_list :: "list2" where
"bad_list ≡ ([1,2],[3,4,5])"
我可以定义一个单独的谓词,用于检查一对列表是否正常:
definiti
在我的理论中,有4种藏品。对于我为所有操作定义的每个集合类型count和:
theory MyCollections
imports Main
"~~/src/HOL/Library/Dlist"
"~~/src/HOL/Library/Multiset"
begin
typedef 'a mybag = "UNIV :: 'a multiset set" .. (* not unique, not ordered *)
typedef 'a myseq = "UNIV :
我试图证明这个引理:
lemma
assumes "x = inv f y" and "inj f" and "x ≠ undefined"
shows "y ∈ range f"
using assms try
但挑剔告诉我这句话不是真的:
Trying "solve_direct", "quickcheck", "try0", "sledgehammer", and "nitpick"...
Nitpick found a counterexample for card '
问题1:有人知道伊莎贝尔/ML是否通过魔法工作吗
问题2:是否有一些标准的正则表达式库供开发人员用于Isabelle/ML
我有一个学习Scala的宏伟计划,我的主要应用程序将处理一个THY文件以生成一个TEX文件
我喜欢Scala的想法,但是每天,在思考它有多伟大之后,我都没有学习它的动机,因为学习它的全部力量需要数月的工作,然后是一些持续的学习。我的目标不是学习编程,而是和伊莎贝尔一起学习数学
因此,我正在大力转向Isabelle/ML,因为接下来几个月的学习ML,以及对它的持续研究,将成为
我问了一系列问题,以达到我可以在Isabelle中定义以下简单模型的程度,但我仍然坚持得到我想要的。我试着用一个例子非常简单地描述这个问题:
例子:
假设我有两类人和车,人拥有汽车,也驾驶汽车。因此,我需要以下类型/组:
人
汽车
拥有(*拥有将人与车的要素关联起来*)
驱动(*驱动也将人与车的要素联系起来*)
问题:
我想在Isabelle中阐述上述示例,它提供了以下灵活性:
让我定义一些约束条件;例如:如果一个人拥有一辆车,他/她肯定会驾驶这辆车。我可以用一个友好的回答来做到这一点
允许我定
希望使用子目标运行let定义的列表?aa=[1,2]
并在此aa上运行rev_应用程序,并将值显示为[2,1]
theory Scratch2
imports Datatype
begin
datatype 'a list = Nil ("[]")
| Cons 'a "'a list" (infixr "#" 65)
(* This is the append function: *)
primrec app :: "'a list => 'a li
是否有可能使用Isabelle证明助手定义一个涉及变量数函数的理论
例如,我想定义arity n的所有谓词的理论,它们通过循环置换保持不变。
给定一个类型T和一个整数n,
我想定义arity n的所有谓词的理论,例如:pa_1,。。。A_n P A_n A_2,…,A_n-1
在Coq中,可以使用依赖类型,我想知道是否有一种方法可以使用Isabelle来表达这一点?Isabelle/HOL在某种程度上支持具有任意但固定算术性的函数。标准技巧是将函数在其类型中的arity编码为类型的基数。因此,实
我是伊莎贝尔的新手,试图证明以下简单的不等式:
lemma ineq:
"(a::real) > 0 ⟹ a < 1 ⟹ (b::real) > 0 ⟹ b < 1 ⟹ (a + b - a * b) > 0"
proof
have "1/a + 1/b > 1" by auto
qed
引理ineq:
“(a::雷亚尔)>0⟹ a0⟹ b0“
证明
自动设置“1/a+1/b>1”
量化宽松
我试图用上面的一行来展示它,但显然不是那么容易,无论我尝
我知道Isabelle可以通过构造函数进行案例分析(例如列表),但是
有没有一种方法可以根据条件是真是假来划分案例
例如,在证明以下引理时,我的逻辑(如以下无效语法中的无效证明所示)是如果条件“x∈ “A”是真的,证明简化为琐碎的东西;当条件为假(即“x”)时,它也会简化∉ (A):
但我不知道如何将这个英文的“案例分析”翻译成伊莎贝尔
在Isabelle/HOL中,有没有办法通过条件的真假来表达这种案例分析?(截至2021年伊莎贝尔)
(或者它是否需要额外的公理,如排除中间法则?您几乎正确地猜
假设我有一个引理mylem:foo?a=bar?a,我需要将它应用于两次出现foo的目标,例如baz(foo(fpq))(foo(grs)),但只在其中一个位置。我知道有两种方法可以不用写出所有的p,q…,它们可以是复杂的表达式
使用apply(subst mylem)后跟适当数量的back命令
使用apply(subst mylem[其中a='foo x y',standard]),其中x和y是未绑定的名称
这里使用subst只是为了演示;我真的很想修改引理,例如,当有多个可能的匹配时,我
我想(错过-)用Isabelle来证明两个给定的公式在语法上是等价的。例如A∧ B=B∧ A
关于公式背后的逻辑,我不想详细讨论。我不想关心那件事∧ 当A和B都为真时,B为真。我只想在结构层面上比较这两个公式,并说它们是等价的,因为它们具有交换性质
基本上,我希望能够写出比较两个公式和一些等式函数的引理,并使用给定的公理,不管它们是如何指定的
到目前为止,我认为这可以而且应该使用公理化来完成,但是这里的每个人都告诉我公理化是不好的
这就引出了我的问题:这项任务应该如何完成。在《伊莎贝尔》中,如何
很抱歉,我没能给出一个简短的例子
我有证据证明
1. ⋀e1 T1 L e2 T2 G1.
typing (G1 @ (x, U) # G2) e1 T1 ⟹
typing (G1 @ G2) e1 T1 ⟹
(⋀xa. xa |∉| L ⟹
typing ((xa, T1) # G1 @ (x, U) # G2) (open e2 (exp_fvar xa))
T2) ⟹
(⋀x
我只是从Isabelle/HOL开始,试图证明一个简单的HOL语句“p(t)⟶ (∃x.P(x))“具有自然演绎规则。我从一个理论文件开始,其中只包含一个定理:
theory simple imports Main
begin
lemma T: shows "P(t) ⟶ (∃x . P(x))"
proof
(* x *)
qed
end
在注释中标记为x的位置,当前目标已经是“p(t)⟹ (∃即逻辑蕴涵已经简化为元逻辑蕴涵
通过反复试验,我得到了以下证据:
proof
as
下面是一个从语言foo到bar的简单翻译:
type_synonym vname = "string"
type_synonym 'a env = "vname ⇒ 'a option"
datatype foo_exp = FooBConst bool
datatype foo_type = FooBType | FooIType | FooSType
datatype bar_exp = BarBConst bool
datatype bar_type = BarBType | BarI
我对使用Isabelle/Isar编写既可供人阅读又可由机器检查的校样感兴趣,我希望改进我的风格并简化我的校样
prog prove有以下练习:
练习4.6.定义递归函数elems::'列表⇒ '一套和证明x∈ 元素xs⟹ ∃ ys zs。xs=ys@x#zs∧ x∉ elems ys
我的解决方案是模仿我用钢笔和纸写的东西
fun elems :: "'a list ⇒ 'a set" where
"elems [] = {}" |
"elems (x # xs) = {x} ∪ elems
存在一个快捷方式或命令,允许人们直接进入符号或引理的定义。(如Emacs的GTAGS中的“ALT+,”)
与Coq的相反(只是imho),它非常方便,因为Coq必须在IDE中执行搜索命令
我忘了应该按哪个键组合来查找基于jEdit的标准Isabelle IDE中的定义
您能提醒我一下吗?在Windows和Linux系统上是控制键,在macOS系统上是命令键。见本手册第1.2节
我正在尝试为此函数提供自动终止证明:
function aux :: "('a ⇒ bool) ⇒ 'a list ⇒ 'a list" where
"aux p xs = (if ¬isEmpty xs ∧ p (hd xs) then hd xs#aux p (drop 1 xs) else [])"
by pat_completeness auto
有空
我在这方面完全是新手,所以我不知道终止证明是如何工作的,或者pat_完整性是如何工作
当我有很多假设时,有时我会得到很多临时的名字,这些名字会把证据弄得乱七八糟
我说的是这样的事情:
lemma foo: ...
proof
assume P: ... and Q: ... and R: ...
then have ...
then have ... using P ...
then have ... using P R ...
then show ...
proof
assume A: ... and B: ... and C: ...
th
在应用脚本中使用apply(rule)时,通常会选择适当的规则。结构化证明中的证明也是如此。我在哪里可以了解/查找使用的规则的名称?所有声明为纯的内容。intro/intro/iff(或其?或!变体之一)被视为默认的引入规则(即,如果没有链接当前事实)。类似地,声明为Pure.elim/elim/iff的所有内容都被视为默认消除规则(即,如果当前事实被链接)。通常,后面的声明优先于前面的声明(至少如果使用相同类型的声明…混合,例如,Pure.intro?与intro等,结果可能会不同)
然而,这
我正在比较和的关联性证明
列表上的证明采用归纳法
lemma append_assoc [simp]: "(xs @ ys) @ zs = xs @ (ys @ zs)"
by (induct xs) auto
但是,关于Nats的证据是
lemma nat_add_assoc: "(m + n) + k = m + ((n + k)::nat)"
by (rule add_assoc)
为什么我不需要对nat\u add\u assoc证明进行归纳?这是因为自然数发生了某种自动化吗?自然数
在下面的示例中,我想使用simp来证明
简单输入lambda演算类型检查。
我添加每个类型检查规则作为simp的重写规则,因此simp执行
在此过程中,条件重写并创建原理图变量。
但是,在重写某些重写的附带条件时,simp会
坚持重写涉及原理图变量的术语,因为它没有
举例说明:
theory Stlc imports Main
begin
type_synonym var = string
datatype exp =
Var var
| Const nat
| Plus e
我想证明以下几点
lemma
fixes pi :: "'a path" and T :: "'a ts"
shows "valid_path T pi s ⟹ ∀ op ∈ set pi. valid_operator T op"
通过pi上的归纳,其中
fun valid_path :: "'a ts ⇒ 'a path ⇒ 'a state ⇒ bool" where
"valid_path T [] s = True" |
"valid_path T (op#ops) s =
假设我已经定义了一个感应集,例如,感应集“偶数”,这样:
inductive_set Even :: "int set"
where ZERO : "0 ∈ Even"
| PLUS :"x ∈ Even ⟹x+2 ∈ Even"
| MIN :"x ∈ Even ⟹ x-2 ∈ Even"
lemma aux : "x= ((x::int)-2) + 2&
我试图在Isabelle中定义我自己的简单max函数,并证明其终止性:
fun two_integer_max_case :: "nat ⇒ nat ⇒ nat" where
"two_integer_max_case a b = (case a > b of True ⇒ a | False ⇒ b)"
termination by auto
但终止证明中有一个未处理的目标:
proof (prove)
goal (1 subgoal):
1
这是问题的继续
在那里我们学到了这一点
assume "(A ∨ B) ∧ C"
hence "thesis"
proof (elim conjE disjE)
是一个很好的成语来解决这种连词
但是,如果我在能够使用elim…之前,还需要应用一个介绍规则,比如,一些归纳法,或者equalityI,该怎么办呢。如果我尝试
have "(A ∨ B) ∧ C ⟷ (A' ∨ B') ∧ C'"
proof (rule iffI, elim conjE disjE)
然后,elim只作用于第一个目
在我的理论中,我有一些更大的定义,从中我用引理导出了一些简单的性质
我的问题是,简化程序没有使用导出属性的引理,我必须手动实例化它们。有没有办法让这更自动化
下面是一个简单的例子:
definition complexFact :: "int ⇒ int ⇒ int ⇒ bool" where
"complexFact x y z ≡ x = y + z"
lemma useComplexFact: "complexFact x y z ⟹ x = y + z"
by (simp add: c
当应用错误的策略或错误的扣减规则时,错误消息通常过于笼统:
Failed to apply initial proof method⌂
我用伊莎贝尔教自然演绎。当Isabelle投诉时,一些学生随意改变规则/策略,而没有思考错误的可能原因。我认为,更详细的错误信息可能是Isabelle学习过程的一部分
如何使这些错误消息对学生友好?这是否需要编辑源代码,或者可以通过定义更具表现力的自然演绎策略来管理源代码?Isabelle中的策略可以被认为是目标状态的可链接的非确定性转换。这意味着,具体是什么
我如何在伊莎贝尔中证明简单引理cd:card{m∈ℕ. 你这句话的问题在于它不是真的。看看这个词的定义ℕ 使用thm Nats_def:ℕ = 射程
of_nat是从自然到半环的正则同态,即具有1的半环ℕ 基本上是这样说的ℕ 由一个自然数n的环的所有元素组成。如果你看{m的类型∈ℕ. 你这句话的问题在于它不是真的。看看这个词的定义ℕ 使用thm Nats_def:ℕ = 射程
of_nat是从自然到半环的正则同态,即具有1的半环ℕ 基本上是这样说的ℕ 由一个自然数n的环的所有元素组成。如果你看{
数学中有一个小定理:
假设u不是A的元素,v不是B的元素,f是从A到B的内射函数。设A'=A并集{u}和B'=B并集{v},如果x在A中,则通过g(x)=f(x)定义g:A'->B',g(u)=v。那么g也是内射的
如果我编写类似OCaml的代码,我会将A和B表示为类型,将f表示为A->B函数,类似于
module type Q =
sig
type 'a
type 'b
val f: 'a -> 'b
end
definition injective ::
为什么第二引理的“自动”证明挂起?第二个引理是第一个引理的特例
primrec ListSumTAux :: "nat list ⇒ nat ⇒ nat" where
"ListSumTAux [] n = n" |
"ListSumTAux (x#xs) n = ListSumTAux xs (n+x)"
lemma ListSumTAux_1 : " ∀a b. ListSumTAux xs (a+b) = a + ListSumTAux xs b"
我一直在玩弄《伊莎贝尔》中的基本证明例子
考虑以下简单的证明:
lemma
fixes n::nat
shows "n*(n+1) = n^2 + n"
by simp
在我看来,像伊莎贝尔这样强大的证明助手应该能够在没有太多指导的情况下证明这个引理。
然而,我惊讶地发现Isabelle在这里应用规则simp实际上失败了(我还尝试了其他“通用”规则,如simp_all、auto、force、blast,但结果是一样的)
如果我将最后一行替换为以下内容,则结果是:
by
我试图定义代码等式:
datatype t = A | B | C
inductive less_t :: "t ⇒ t ⇒ bool" where
"less_t A B"
| "less_t B C"
code_pred [show_modes] less_t .
fun less_t_fun :: "t ⇒ t ⇒ bool" where
"less_t_fun A A = False"
| "less_t_fun A B = True"
| "less_t_fun A C
当我确定Isabelle中的nat为正时,我怎样才能对它进行整型呢
value "((-10)::int) mod 3"
例如,给出了2,如果我是正确的,任何对int的模的应用都会导致nat
不幸的是,模的类型签名是'a=>'a=>'a,因此我无法事先将3修正为nat,结果将是int。您可以使用值nat-10::int mod 3 值nat-10::int mod 3
我目前还没有弄清楚如何正确使用preference_tac。(伊莎贝尔)
我正在做以下工作(最低限度的工作示例):
我收到了第一个Preference_tac调用的异常(第一次调用时的状态):
而我希望它能起作用。为什么不呢?如果这是因为一些琐碎的原因,我很抱歉。我真的不是伊莎贝尔内部的专家
第二个电话有效。
在第二次呼叫时声明:
proof (prove)
goal (3 subgoals):
1. True
2. False
3. A
我在问自己为什么这样做。哪种无形的影响
SELE
在Isabelle中似乎有一个重写工具,可以提高subst证明的质量。请参阅和发行版中的HOL/ex/Rewrite_Examples.thy
现在,我有一个这样的定理:
引理rho_不变性_1:
加法(ρ(x1,y1))(x2,y2)=ρ(加法(x1,y1)(x2,y2))
我意识到为了证明这一点更方便:
引理rho_不变性_1_点:
“添加(ρp1)p2=ρ(添加p1 p2)”
为此,我可以做到:
使用rho_不变性_1
应用(在“p1”满射_配对处重写)
我的问题很简单,我能用同一个命令重
我定义了locale并证明了几个定理。现在我需要在这个区域/上下文之外使用它们。我怎样才能做到?
我能通过语言环境的假设扩展假设得到定理吗?(就像在Coq中一样。)
我需要得到定理“a”∈A==>A∈上述定义的thm中的“A”。(我不需要这个定理,它只是一个通过扩展假设集获得定理的最简单示例。(mylocale中的thm没有任何假设))区域设置上下文中的每个定义和定理都会生成一个全局版本。您可以使用locale\u name.constant\u name或locale\u name.Therm
我已经研究了Isabelle教程,该教程提供了一个验证安全协议的示例。然而,这有点超出我的理解,因为我只知道基本知识。我正在寻找一些例子,这些例子不仅是简单的定理,而且是使用Isabelle/HOL的实际应用。
例如,证明一些算法或可能是验证系统属性或一些非平凡的数学定理。在任何地方都有这样的例子吗
我已经查看了伊莎贝尔官方页面上提供的所有应用程序列表,但大多数都是定理的证明
我还在看一个使用Alloy进行文件系统验证的示例。它提供了一个可以验证文件/目录属性的证明。我正在寻找类似的东西。我现在
在Isabelle/HOL中,是否可以使用具有一系列等价关系的商类型机制对一系列相互递归的数据类型进行商
如果是这样的话,有没有一个很好的例子?搜索Isabelle文档,以及描述改进后的商类型机制的文章,都没有什么帮助。命令商类型一次只能处理一种类型。如果你想在几个相互类型上做一个商,你必须手工进行编码和解码,但是这很简单
假设您的两种类型是t1和t2,具有等价关系r1::t1=>t1=>bool和r2::t2=>t2=>bool。那么
quotient_type q = "t1 + t2" /
如何在Isabelle中定义常量集?例如{1,2,3}(给它一个更有趣的扭曲,1,2,3是实数),或者{x\in N:x
我正在创建表单的一个函数
y(t+h)=y(t)+h/y(t)
其中y(0)=1
fun y::“真的⇒ 真正的“哪里
“y 0=Suc(0)”|
“y(t+h)=y(t)+h*(1/y(t))”
不幸的是,我得到了一个错误
定义格式错误:顺序模式中不允许使用非构造函数模式
y 0=实际值(Suc 0)
谷歌告诉我,我没有遵循某些真正数据类型的构造函数模式,但我无法找到该模式是什么以及应该如何更改我的函数 实数不是代数数据类型,因此无法使用fun对其进行模式匹配。您必须使用“普通”等式定义或函数
为了更好地理解Isar和战术证明之间的对应关系,我正在使用Isabelle/HOL教程中的一个例子
这是一个有效的版本:
lemma rtrancl_converseD: "(x,y) ∈ (r ^-1 )^* ⟹ (y,x) ∈ r^* "
proof (induct y rule: rtrancl_induct)
case base
then show ?case ..
next case (step y z)
then have "(z, y) ∈
上一页 1 2 3 4 5 6 ...
下一页 最后一页 共 17 页