在Isar中,一个人在目标的前提下使用假设,这样她就可以用它得出结论
说
这是否是假设的唯一用途,即从目标的前提中获取事实
更新:因为有些人认为这太宽了,我不明白,我试着去做。
重新提出问题
本手册介绍了假设的逻辑内容。但是它的用途是什么呢?这是否仅限于当我从目标的前提中得到一个事实时的情况?我看到假设关键字的两个用法,当然是同一过程的两个实例:说明待证明属性的前提
如果我们举一个愚蠢的例子:
lemma "∀A B C D. A ⟶ B ⟶ C ⟶ D ⟶ (A ∧ B) ∧ (C ∧ D)
给定函数f:
definition f :: "real => real"
where "f x = x"
我可以通过下面的引理证明,当n趋向于0时,fx+n趋向于fx
lemma "(λn. f(x+n)) -- 0 --> f x"
unfolding f_def
apply (auto intro!: tendsto_eq_intros)
done
作为进一步的步骤,我想说明当y-x趋于0时,fx+y-x趋于fx。本质上,让n=y-x
我很难解决这个问题,因为我不能代替la
我看过很多关于Isabelle语法和证明策略的文档。然而,我对它的基础知之甚少。我有几个问题,如果有人能抽出时间回答,我将不胜感激:
为什么Isabelle/HOL不承认不终止的函数?许多其他语言,如Haskell,都允许使用非终止函数
什么符号是伊莎贝尔元语言的一部分?我读到元语言中有符号用于通用量化(/\)和含义(==>)。但是,这些符号在对象级语言中有对应的符号(∀ 和-->)。我知道-->是类型为bool=>bool=>bool的对象级函数。但是,你是怎么做到的∀ 及∃ 定义它们是对象级
我想完成这个证明
我如何轻松/优雅地使用通过挑剔找到的值?(在…部分写什么?)
或者,我如何利用吹毛求疵找到反例的事实来完成证明
lemma Nitpick_test: "¬(((a+b) = 5) ∧ ((a-b) = (1::int)))" (is "?P")
proof (rule ccontr)
assume "¬ ?P"
nitpick
(* Nitpicking formula...
Nitpick found a counterexamp
考虑以下愚蠢的Isabelle树和子树定义:
datatype tree = Leaf int
| Node tree tree
fun children :: "tree ⇒ tree set" where
"children (Leaf _) = {}" |
"children (Node a b) = {a, b}"
lemma children_decreasing_size:
assumes "c ∈ children t"
shows "s
我正在尝试向代理列表发送消息。为此,我编写了以下函数:
fun multicast :: "[msg, agent, agent list]=> event set"
where
multicast_Nil: " multicast M A [] ={}"
| multicast_Cons: " multicast M A (x#xs) = {Says x A M} Un multicast M A xs"
fun knows :: "[agent, e
给定一个生成相同项列表的函数,我想证明生成的列表在所有位置都由给定的自然数组成,与列表长度无关
fun pattern_n :: "nat ⇒ nat ⇒ nat list" where
"pattern_n _ 0 = []" |
"pattern_n n lng = n # (pattern_n n (lng - 1))"
lemma pattern_n_1: "lng > 0 ∧ pos ≥ 0 ∧ pos < lng ∧ n ≥ 0 ⟹ (pattern_n n lng
伊莎贝尔/杰迪特身上的色码是什么意思?我在地图上找不到他们的描述。它写的唯一的东西是
Prover反馈通过颜色、方框、扭曲下划线和超链接来工作-
链接,弹出窗口,图标,可点击输出-所有基于语义
背景中由Isabelle生成的标记
颜色用作校对脚本背景,并位于滚动条旁边的垂直条上
您能指出一些文档或在这里解释一下吗?您可以在“插件/插件选项”和“Isabelle/Rendering”中看到它们的名称并更改它们。这些名称给出了相对清晰的解释,您可以从名称中使用的术语中参考手册
有很多种颜色,所以我不
这是一个简单的类型系统,包含以下类型:any、void、integer、real、set
datatype ty =
AType
| VType
| IType
| RType
| SType ty
类型形成具有上确界的半格:
notation sup (infixl "⊔" 65)
instantiation ty :: semilattice_sup
begin
inductive less_ty where
"τ ≠ VType ⟹ VType < τ"
| "τ ≠
我的目标是证明包含生成模式的列表的属性。
在第一个示例中,模式只是一个0序列,引理模式_0_len证明生成列表的长度确实等于生成函数的长度参数
theory pattern_0
imports Main
begin
fun pattern_0 :: "nat ⇒ nat list" where
"pattern_0 0 = []" |
"pattern_0 len = (pattern_0 (len - 1)) @ [0]"
lemma pattern_0_len [simp]: "len
我试图在伊莎贝尔理论中定义函数合成的权利取消性质,但是
有些错误我无法修复
我想在Isabelle中指定的定义如下:
f:A→ B具有权利撤销的性质
∀ C:(∀ g、 h:B→ C):g◦ f=h◦ f=⇒ g=h
可能吗?或者更准确地说,是否有可能对一种类型进行量化
提前感谢不可能显式地量化多个类型。如果用类型变量证明引理,则该引理对于该类型的所有实例化都是隐式证明的
在某些情况下,您可以使用变通方法并使用AFP条目中的类型V。这种类型的V基本上是一种元素太多的类型,以至于有一个从(几乎?)
在Isabelle中,是否可以为一个函数f生成代码,该函数是使用某个递归函数f_helper定义的,其中f_helper通常不终止,但总是为f中应用于它的输入终止
例如,我目前正在尝试使用一个非常类似于以下函数的函数f_helper,该函数在有限自动机上执行powerset构造-在每个递归步骤中,从自动机的转换集计算(转换)在这一步骤中考虑的幂集结构的一组状态( todo>代码>)源于“ todo/中的状态的幂集结构的转换以及由这些转换所达到的状态(结果> 参数携带中间结果):
该函数当然不会因
让我们假设我们有一些谓词
definition someP :: "('a × 'a) ⇒ 'a ⇒ 'a ⇒ bool"
和一个感应式
inductive my_inductive :: "('a × 'a) ⇒ 'a ⇒ bool"
for "a_b" where
basecase: "fst a_b = a ⟹ my_inductive a_b a" |
stepcase: "someP a_b x y ⟹ my_inductive a_b x ⟹ my_inductive a_b
这是一个初学者的问题
我正在学习“Isabelle/HOL中的编程和证明”教程
我想打印“1+2”的结果
于是我写道:
value "1 + 2"
其中:
"1 + (1 + 1)"
:: "'a"
我希望看到结果,即“3”。我怎么能在伊莎贝尔身上做到这一点?
如果我在定理证明器中规范化“1+2”,则显示结果3。我只想在伊莎贝尔身上做同样的事
请注意,我昨天开始使用Isabelle。这是我的问题。从一个初学者到另一个初学者,多么幸运
我不知道所有的细节,但是如果你没有为常数1和2指定类型,
我想了解Isar虚拟机的状态机
提供了良好的概述,但没有在输出面板中详细说明其消息。这很可能是该系统的后续补充
我有一个简单的Isar证明:
theory Propositional
imports Main
begin
lemma nj2: assumes p: P and q: Q shows "P ∧ (Q ∧ P)"
proof -
from q p have qp: "Q ∧ P" by (rule conjI)
from p qp show "P ∧ (Q ∧ P)" b
我有一个方法可以生成大量可能的状态,当使用,与(有条件的)失败或策略no_tac链接时,最终的组合方法需要很长时间才能终止,并导致Isabelle接口延迟。但是,当使用两个applys分别应用相同的方法时,终止非常快。有没有办法强迫艾斯巴赫方法在失败时不要回溯,而是立即失败?(本质上,作为apply cond_fail而不是apply(,cond_fail)?)我不认为在vanilla Eisbach中有直接实现这一点的方法,但定义新的组合方法(即高阶方法)相对容易
我们现在有一些。具体来说,d
在Isabelle/HOL中,我可以通过(SOME.True)来表示任意(但固定)类型的值。是否有更简洁的表示法?未定义
(我希望我能写上面的内容,但答案必须超过9个字符。)
例如,在Coq中有重写,我们也可以使用箭头`我不认为它像Coq版本那样强大,但是
及
重写定理。但是,您不能轻松地以应用样式重写假设 关于自反性呢?最接近自反性的可能是apply(simp(no_asm)),但使用它而不是apply simp,这是非常不自然的。这只是一个旁注:对于皮诺奇的特定应用程序,似乎最好使用apply(rule refl)或干脆。而不是simp(无ams)或simp,因为通过应用重写获得的两个术语将完全相同。当然,总的来说,simp(no_asm)似乎确实与Coq的
又是一个小例子,结果出乎意料
theory Scratch
imports Main
begin
datatype test = aa | bb | plus test test
axiomatization where
testIdemo : "x == plus x x"
lemma test1 : "y == plus y y"
现在我收到以下消息:
Auto solve_direct: The current goal can be solved directly with
我试图证明,在协议运行的跟踪中,消息不会出现在空跟踪中。最终的目标是证明没有主机会向自己发送消息。这看起来很简单,所以我不确定到底发生了什么。我收到的错误是
Failed to apply initial proof method⌂:
using this:
[] ∈ ns_public
goal (1 subgoal):
1. ∀A B X. Says A B X ∉ set_of_list []
这是有问题的代码
inductive_set ns_public :: "event l
我正试图创建我的第一个伊莎贝尔/霍尔理论,该理论编码了单像逻辑,但我已经被第一个公理——身份公理卡住了。我不明白我的代码出了什么问题,因为错误消息并没有给出解释。我的理论是:
theory MonoidalLogic
imports "~~/src/ZF/Main" Sequents
begin
consts
Mult :: "[o, o]⇒o"
axiomatization where
identity: "P ⊢ P"
(* and
cut: "φ⊢ψ;ψ⊢ρ⟹φ⊢ρ"
我的理论中有3种布尔类型:
bool={True,False}
bool3={True,False,⊥}
bool4={True,False,⊥,ε}
bool3基于bool:
typedef bool3 = "UNIV :: bool option set" ..
definition bool3 :: "bool ⇒ bool3" where
"bool3 b = Abs_bool3 (Some b)"
notation bot ("⊥")
instantiation bool
我试图基于fmap为数据类型定义上确界操作:
datatype t = A | B | C "(nat, t) fmap"
abbreviation
"supc f xs ys ≡
fmmap_keys
(λk x. f x (the (fmlookup ys k)))
(fmfilter (λk. k |∈| fmdom ys) xs)"
fun sup_t (infixl "⊔" 65) where
"A ⊔ _ = A"
| "B ⊔ B = B
我对论证的一个变化感兴趣,它确立了:
"(∑ i=1..k . i) = k*(k+1) div 2"
我们从一个简单的归纳中知道这一点,但插管有点不同。看这个公式的一个方法是,如果你对数字序列1..k的极值求和,你得到
1+k=2+(k-1)=……
然后你只需要乘以正确的次数就可以得到完整的和
我想重复这一论点,以表明以下不平等:
"(∑n = 1..k - 1. cmod (f (int n))) ≤ 2 * (∑n ≤ k div 2. cmod (f (int n)))"
这里我知道
我正在尝试编写一个函数,该函数接受第二个参数,该参数可以是0或1:
typedef f_2 = "{0::nat,1}"
function proj_add :: "(real × real) × f_2 ⇒ (real × real) × f_2 ⇒ (real × real) × f_2" where
"proj_add ((x1,y1),l) ((x2,y2),j) = ((add (x1,y1) (x2,y2)), (l+j) mod 2)"
if "delta x1 y
我想将“大”自然数定义为大于10的自然数,“小”自然数定义为小于5的自然数。我可以将这些定义表示为区域设置:
locale Big =
fixes k :: ‹nat›
assumes ‹k > 10›
locale Small =
fixes k :: ‹nat›
assumes ‹k < 5›
但是我如何表达和证明7不是小的呢?我可以证明它不小于5,但证明不令人满意,因为它根本没有提到小的区域:
lemma ‹¬ ((7 :: nat) < (5 ::
这代表了我想要的,但不起作用:
syntax
"_F_hex" :: "any => any" ("F;")
translations
"F;" => "True,True,True,True"
我会使用F如下所示:
[F;,F;] == [True,True,True,True,True,True,True,True]
Isabelle必须能够解析翻译的右侧,但是True,True,…不能生成有效的语法树。如果使用F仅在列表枚举中,您可以扩展列表枚举的语法转换规则,如下
下面的注释显示了术语命令的输出:
declare[[show_sorts]]
term "x"
(* "x::'a::{}" :: "'a::{}" *)
term "x::'a"
(* "x::'a::type" :: "'a::type" *)
在关于类型类的部分标题中,我使用了短语“nat to type”,我的意思是“nat to'a”(我不使用它,因为单词通常在标题中工作得更好)
我需要简洁,但如果我在技术上也合理正确,那就更好了
更新:在这里,我试图澄清我的问题。我想我是这
在完成Isabelle教程中的练习时,我遇到了一个让我困惑的情况。为什么下面这个涉及列表前置的引理很容易被证明:
lemma ‹count_list xs x = n ⟹ count_list (x # xs) x = Suc n›
by simp
而这个涉及追加的不是吗
lemma ‹count_list xs x = n ⟹ count_list (xs @ [x]) x = Suc n›
apply auto (* just does some minor rewriting *
在Isabelle中,我可以使用任意关键字在归纳证明中概括变量。这显然适用于普通归纳法,如apply(归纳法n任意:m)。我还可以进行规则归纳,如apply(归纳规则:R.induct)。但在使用规则归纳法时,我如何概括变量呢
在我的特定用例中,我需要证明rx形式的定理⟹ S y⟹ ⟨…⟩。谓词R是归纳定义的,我想对其使用规则归纳。变量y不能在证明中固定,但必须是任意的。作为解决方法,我已经证明了定理rx⟹ (∀ 是的,是的⟶ ⟨…⟩)相反,但如果不借助大锤,我无法证明这一点,我还猜测使用∀和⟶
我定义了两种值和一个强制转换函数:
theory FSetIndTest
imports Main "~~/src/HOL/Library/FSet"
begin
datatype val1 = A | B
datatype val2 = C | D
inductive cast_val :: "val1 ⇒ val2 ⇒ bool" where
"cast_val A C"
| "cast_val B D"
此外,我还为值列表定义了cast函数:
inductive cast_l
在Isabelle中搜索ML常量是否有类似于查找常量的功能
例如,我希望找到这种类型的常量:“term=>cterm”。当然,“Thm.cterm_Of”可以完成这项工作,但一般来说,使用它会很方便
我从Isabelle/HOL开始,通过发行版中包含的prog-prove.pdf教程进行工作。我在第4.4.5节“规则反转”中被难住了。本教程(基本上)给出了以下示例:
theory Structured
imports Main
begin
inductive ev :: "nat ⇒ bool" where
ev0: "ev 0" |
evSS: "ev n ⟹ ev (Suc (Suc n))"
notepad
begin
assume "ev n"
from this ha
如何在Isabelle/HOL中声明一个不服从排序约束的引理
解释为什么有意义,考虑下面的例子理论:
theory Test
imports Main
begin
class embeddable =
fixes embedding::"'a ⇒ nat"
assumes "inj embedding"
lemma OFCLASS_I:
assumes "inj (embedding::'a⇒_)"
shows "OFCLASS('a::type,embeddable_cl
我正在尝试定义自定义集类型:
notation bot ("⊥")
typedef 'a myset = "UNIV :: 'a fset option set" ..
definition myset :: "'a fset ⇒ 'a myset" where
"myset b = Abs_myset (Some b)"
instantiation myset :: (type) bot
begin
definition "⊥ = Abs_myset None"
instance .
在伊莎贝尔身上有什么工具可以描述战术吗
我基本上有一个战术的形式
REPEAT ( tac1 ORELSE ... ORELSE tacN )
我想计算出每种战术的持续时间,以确定
优化的热点
我可能需要以嵌套方式执行此操作,例如
tac1 = tac12 THEN simp_tac ...
我想知道在简化上花了多少时间。不确定这是否是您要找的,但是有timeit在ML中,您可以围绕函数进行包装。这是一个艾斯巴赫包装:
ML \<open>fun method_evaluate
在书的第77页,有一个例子显示:
本例中使用的证明结构用于计算推理。然后,最新的等式右侧应等于当前等式的左侧,如下所示:
您能解释一下示例1中发生了什么吗?欢迎!你的问题相当含糊。你到底有什么问题?
在学习Isabelle(2020)时,我试图将其文档(PDF)中的一个示例复制到一个.thy文件中,该文件包含一个迭代的含义。由于文档是PDF格式的,我不知道它的正确ASCII应该是什么。我能得到的最接近的结果是:
lemma "[[ xs @ ys = ys @ xs ; length xs = length ys]] ==> xs = ys"
但伊莎贝尔抱怨说“内部语法错误”。我试图使用“[…;…]”,但伊莎贝尔似乎将其视为一个列表,并抱怨列表和布尔之间的冲突
采用阶乘函数的标准定义:
primrec factorial :: "nat ⇒ nat"
where
"factorial 0 = 1"
| "factorial (Suc n) = (Suc n) * (factorial n)"
如果我们要求值“factorial 3”,伊莎贝尔可以预料地给我们6。然而,如果我们试图将其作为引理,它将失败:
lemma "factorial (3::nat) = (6:
我试图用partial\u函数关键字定义一个分部函数。它不起作用。下面是一个最能表达直觉的例子:
partial_function (tailrec) oddity :: "nat => nat"
where
"oddity Zero = Zero "
| "oddity (Succ (Succ n)) = n"
然后我尝试了以下方法:
partial_function (tailrec) oddity :: "nat => nat"
where
"oddity arg =
我想制作一个列表数据类型,作为HOLCF中Porder.thy中偏序集的一个实例。我的尝试如下:
theory Scratch
imports Porder Representable
begin
datatype 'a myList =
Nil |
Cons 'a "'a myList"
instantiation myList :: (below) below
begin
definition below_list_def:
"(x ⊑ y) = (case x o
在Isabelle中,给定一个定理thm,其中包含一个自由变量x(更准确地说,是一个原理图变量),可以使用where-属性实例化x
例如,thm[其中x=5]
如果变量名以数字结尾,例如,thm[where x1=5],则无法实现此功能。这似乎是由于该变量在定理中表示为“?x1.0”,而不是“?x1”
下面的理论给出了一个例子
我的问题是:如何在这样一个定理中实例化x1?(例如,下面理论中的定理。)
我知道的“解决方案”:
-使用thm[of 1]而不是thm[其中x1=1]。这在某些情况下是可
我试图证明以下引理:
lemma tranclp_fun_preserve:
"(⋀x y. x ≠ y ⟹ f x ≠ f y) ⟹
(⋀x y. f x ≠ f y ⟹ x ≠ y) ⟹
(⋀x y. f x = f y ⟹ x = y) ⟹
(λ x y. P x y)⇧+⇧+ (f x) (f y) ⟹ (λ x y. P (f x) (f y))⇧+⇧+ x y"
apply (erule tranclp.cases)
apply blast
lemma
有没有办法定义Isabelle/HOL中类型的语法替换
我想这样做:
syntax my_short_list :: "type" ("my-list")
translations "my_short_list" ⇌ (type) "'a list" ― ‹Could not find syntax to express this ...›
locale foo =
fixes blub :: "my-list ⇒ my-list"
我想这样解释:
locale foo =
fix
此模式生成器在给定位置生成一个具有给定数字的列表,所有其他值均为零
fun pattern_one_value :: "nat ⇒ nat ⇒ nat ⇒ nat ⇒ nat list" where
"pattern_one_value _ _ _ 0 = []" |
"pattern_one_value pos pos1 val lng =
(if pos = pos1 then val else 0) # (pattern_one_value pos (pos1
是否可以从isabelle dump中恢复每行校样或其位置?
在dump输出的theory/thm文件中,我们可以找到定义的定理,但找不到证明
您需要此文件才能进行我的导入:
(* tested with Isabelle2013-2 *)
theory Notepad
imports
Main
"~~/src/HOL/Library/Polynomial"
begin
notepad
begin
我有三个几乎相同的引理
版本1:
{
fix a :: "('a:: comm_ring_1) poly"
have "degree((monom 1 1) -CONST pCons a 0) =1" sledgeham
我知道在Isabelle中,y=x(| I:=1 |)意味着x和y有而且只有一个不同的点,那就是I。非常精确
但是如果我不知道I在y中的值,或者我不能轻松地写出它,该怎么办
我尝试了所有项目的我y=x,但是当有大量的i时,它是丑陋的
我的问题是,我能得到一个像(| |)这样的“精确”表达式吗?,只有几个不准确的点,这样我就不需要为所有项目编写我y=x?我认为您的“所有项目”方法在这里似乎相当合理。也许这比绝对必要的时间要长一点,但至少你的意思很清楚。使用Isabelle语法,您可以编写:
"∀i
假设我有一个目标a⟹ B⟹ C⟹ G目标很难实现(由一些证明义务产生),并且在我的开发过程中多次出现(形状类似)
因此,我创建了一个引理foo,以简化形状a的目标⟹ C⟹ (P⟹ Q)⟹ G
我想能够写作
case goal42
thus ?case
proof (rule foo)
assume P
show Q sorry
qed
但是这失败了,因为foo不使用B。有效的是
case goal42
thus ?case
apply -
app
在Isabelle/Pure(⟹和⋀),其行为与对应的HOL不同(∀ 及→).
存在量化是否有一个元符号?如果没有,这一决定是否有具体原因?纯粹是基于直觉主义逻辑,在这个逻辑中没有存在量化
大致相当于获得:
lemma
assumes "P"
obtains x where "Q x"
生成的引理是p⟹ (⋀x、 Q x⟹ 论文)⟹ 论文。它不包含一个存在量词,只包含一个蕴涵。但是它起着一个类似的规则:通过将论文与任何其他目标实例化,你可以展示x
1 2 3 4 5 6 ...
下一页 最后一页 共 9 页