与Coq相比,Isabelle/HOL证明助手是否有任何弱点和优势?
让我们有一个归纳类型为的foo
索引x : X
。
Parameter X : Type.
Inductive foo : X -> Type :=
| constr : forall (x : X), foo x.
Run Code Online (Sandbox Code Playgroud)
如果foo x = foo y
暗示的话,我很好奇x = y
。我不知道如何证明这一点。
Lemma type_equality_implies_index_equality : forall (x y : X), foo x = foo y -> x = y.
Run Code Online (Sandbox Code Playgroud)
如果无法证明,为什么?
我在Jupyter笔记本的第一个单元格中有以下代码段:
import matplotlib.pyplot as plt
import pandas as pd
import ipywidgets as widgets
import numpy as np
out = widgets.Output()
data = pd.DataFrame(np.random.normal(size = 50))
plt.ioff()
with out:
fig, axes = plt.subplots()
data.hist(ax = axes)
display(fig)
plt.ion()
display(out)
Run Code Online (Sandbox Code Playgroud)
如果重新启动内核并运行第一个单元,则会看到以下输出:
<Figure size 640x480 with 1 Axes>
Run Code Online (Sandbox Code Playgroud)
但是,如果我第二次运行此第一个单元格,则会看到预期的matplotlib图。如果在将matplotlib导入后将所有内容移动到第二个单元格,重新启动内核,然后重新运行整个笔记本,也会显示此行为。
这种行为上的差异是故意的吗?
我很好奇discriminate
战术背后的策略是如何运作的.因此我做了一些实验.
首先是一个简单的归纳定义:
Inductive AB:=A|B.
Run Code Online (Sandbox Code Playgroud)
然后是一个简单的引理,可以通过discriminate
策略证明:
Lemma l1: A=B -> False.
intro.
discriminate.
Defined.
Run Code Online (Sandbox Code Playgroud)
让我们看看证明的样子:
Print l1.
l1 =
fun H : A = B =>
(fun H0 : False => False_ind False H0)
(eq_ind A
(fun e : AB => match e with
| A => True
| B => False
end) I B H)
: A = B -> False
Run Code Online (Sandbox Code Playgroud)
这看起来相当复杂,我不明白这里发生了什么.因此,我试图更明确地证明相同的引理:
Lemma l2: A=B -> False.
apply (fun e:(A=B) => match e with end).
Defined. …
Run Code Online (Sandbox Code Playgroud) 我在Jupyter选项卡小部件中显示图表时遇到问题.请考虑以下代码段:
import matplotlib.pyplot as plt
import pandas as pd
import ipywidgets as widgets
import numpy as np
out1 = widgets.Output()
out2 = widgets.Output()
data1 = pd.DataFrame(np.random.normal(size = 50))
data2 = pd.DataFrame(np.random.normal(size = 100))
with out1:
fig1, axes1 = plt.subplots()
data1.hist(ax = axes1)
display(fig1)
with out2:
fig2, axes2 = plt.subplots()
data2.hist(ax = axes2)
display(fig2)
tab = widgets.Tab(children = [out1, out2])
tab.set_title(0, 'First')
tab.set_title(1, 'Second')
display(tab)
Run Code Online (Sandbox Code Playgroud)
(我在虚拟环境中的Ubuntu 16.04上运行Python 3.5.2,Jupyter 4.4.0,ipywidgets 7.2.1.)
如果我将此代码放在笔记本的第一行并运行它,我会看到一个带有两个选项卡的选项卡小部件,每个选项卡都显示一个字符串,但不显示图:
如果我第二次运行它,或者如果我matplotlib
在第二个单元格中导入后重新运行它,我会看到一个标签小部件,每个标签上都有一个绘图,但是我在第二次显示之外第二次显示两个绘图标签.
我可以通过包装我的代码摆脱额外的显示器内部调用plt.ioff
和plt.ion
,但它已经向我建议,这是一个黑客.在任何情况下,它都不会使matplotlib显示第一个单元格中的图. …
Coq中的Defintion和'Let'有什么区别?为什么有些定义需要证明?例如.这是集团理论中g1.v的一段代码.
Definition exp : Z -> U -> U.
Proof.
intros n a.
elim n; clear n.
exact e.
intro n.
elim n; clear n.
exact a.
intros n valrec.
exact (star a valrec).
intro n; elim n; clear n.
exact (inv a).
intros n valrec.
exact (star (inv a) valrec).
Defined.
Run Code Online (Sandbox Code Playgroud)
这个证明的目的是什么?
我想知道是否有一种简洁的写作方式,在Coq中存在一种独特的东西(即写出独特的存在量词)?
例如,要说存在一个x
st 2 + x = 4
:
Goal exists x, 2 + x = 4.
Run Code Online (Sandbox Code Playgroud)
我怎么能写出存在一个具有相同属性的唯一 x
?
我知道我可以s.t.
像这样复制部分中的谓词:
Goal exists x, 2 + x = 4 /\ forall y, 2 + y = 4 -> y = x.
Run Code Online (Sandbox Code Playgroud)
但是这通常会有很多重复,有没有办法以某种方式编码一个新的量词,并写:
Goal exists1, 2 + x = 4.
Run Code Online (Sandbox Code Playgroud)
表达同一个目标?
考虑一个接受Set的函数,并返回其字节长度,命名为byteLength
:
byteLength : Set -> Maybe Nat
Run Code Online (Sandbox Code Playgroud)
如果我想直接实现这个函数,我需要在类型参数上进行模式匹配:
byteLength Char = Just 1
byteLength Double = Just 8
byteLength _ = Nothing
Run Code Online (Sandbox Code Playgroud)
但由于不允许在Set/Type上进行模式匹配,因此上述代码无法编译.
所以我们必须将接口定义为变通方法
Interface ByteLength a where
byteLength : Nat
implement ByteLength Char where
byteLength = 1
Run Code Online (Sandbox Code Playgroud)
并且以更一般的方式,也许我们可以使用TypeRep之类的东西在TypeRep上执行类似的事情和模式匹配.但TypeRep也被定义为接口.
我认为使用Interface和使用forall是非常不同的,因为Interface意味着"对于某些类型",而forall意味着"适用于所有类型".
我想知道为什么这些DT语言不支持Set/Type上的模式匹配,是否有一些我不知道的特殊原因?
使用镜头检查有状态地图是否有键的惯用方法是什么?这是我目前的尝试:
module Foo where
import Control.Lens
import Data.Map
import Control.Monad.State
import Data.Maybe (isJust)
check :: Int -> StateT (Map Int Int) IO ()
check k = do
present <- use $ at k.to isJust
unless present $ lift $ putStrLn "Not present!"
Run Code Online (Sandbox Code Playgroud)
这有效,但该to isJust
部分感觉有点笨重......
我是 Coq 的初学者,我很快就学会了这门语言,可以做证明等。
但我不明白我们能用这个做什么。好吧,我们证明了一些定义等。但是我们可以通过哪些方式使用它们呢?我看到我们可以提取 Haskell 文件,但我也不明白。
因为我想用语言来证明例如CVE 。
我是使用Coq的新手.我想问一下我是否想要定义一个集合
A = {x | f(x) = 0}
,我怎么能这样做?我写的东西像:
Definition f0 := nat->nat.
Definition A : Set :=
forall x, f0 x -> 0.
Run Code Online (Sandbox Code Playgroud)
他们没有按预期工作.
非常感谢.
coq ×8
matplotlib ×2
agda ×1
coq-tactic ×1
haskell ×1
haskell-lens ×1
idris ×1
ipywidgets ×1
isabelle ×1
python ×1