小编Art*_*rim的帖子

与Coq相比,Isabelle证明助手有哪些优点和缺点?

与Coq相比,Isabelle/HOL证明助手是否有任何弱点和优势?

formal-methods coq isabelle

63
推荐指数
3
解决办法
8900
查看次数

索引相等的归纳类型意味着索引相等

让我们有一个归纳类型为的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)

如果无法证明,为什么?

coq

9
推荐指数
1
解决办法
54
查看次数

Matplotlib图未显示在Jupyter笔记本第一个单元格的输出小部件中

我在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导入后将所有内容移动到第二个单元格,重新启动内核,然后重新运行整个笔记本,也会显示此行为。

这种行为上的差异是故意的吗?

matplotlib jupyter-notebook

7
推荐指数
1
解决办法
1038
查看次数

歧视策略如何运作?

我很好奇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)

coq coq-tactic

6
推荐指数
2
解决办法
649
查看次数

如何在Jupyter选项卡小部件中显示matplotlib图?

我在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.ioffplt.ion,但它已经向我建议,这是一个黑客.在任何情况下,它都不会使matplotlib显示第一个单元格中的图. …

python matplotlib jupyter-notebook ipywidgets

5
推荐指数
1
解决办法
3363
查看次数

Coq中定义与Let之间的区别

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)

这个证明的目的是什么?

functional-programming theorem-proving coq

4
推荐指数
1
解决办法
496
查看次数

如何在Coq中表达"存在独特的X"?

我想知道是否有一种简洁的写作方式,在Coq中存在一种独特的东西(即写出独特的存在量词)?

例如,要说存在一个xst 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)

表达同一个目标?

coq

4
推荐指数
1
解决办法
807
查看次数

为什么我们不能在Coq/Agda/Idris的Set/Type上进行模式匹配?

考虑一个接受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上的模式匹配,是否有一些我不知道的特殊原因?

coq agda idris

4
推荐指数
1
解决办法
255
查看次数

使用镜头测试地图成员资格

使用镜头检查有状态地图是否有键的惯用方法是什么?这是我目前的尝试:

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部分感觉有点笨重......

haskell haskell-lens

3
推荐指数
1
解决办法
100
查看次数

Coq 证明用法

我是 Coq 的初学者,我很快就学会了这门语言,可以做证明等。

但我不明白我们能用这个做什么。好吧,我们证明了一些定义等。但是我们可以通过哪些方式使用它们呢?我看到我们可以提取 Haskell 文件,但我也不明白。

因为我想用语言来证明例如CVE 。

coq coq-extraction

3
推荐指数
1
解决办法
223
查看次数

在Coq中,如何定义像A = {x |的集合 f(x)= 0}?

我是使用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

1
推荐指数
1
解决办法
77
查看次数