我有一个编程语言的AST的数据类型,我想解释一下,但AST大约有10个不同的构造函数。
data Term : Set where
UnitTerm : Term
VarTerm : Var -> Term
...
SeqTerm : Term -> Term -> Term
我正在尝试编写一个函数,它对这种语言的语法树具有可判定的等价性。从理论上讲,这很简单:没有什么太复杂的,它只是存储在AST中的简单数据。
问题是,编写这样一个函数似乎需要大约100个用例:对于每个构造函数,有10个用例。
eqDecide : (x : Term) -> (y
假设我有算符A和算符B,它们作用于f(x) = 2x。如何创建一个函数来说明在python中A(B(f(X) == B(A(f(X)?
这是我的尝试:
#Commutation: Creating a function that checks whether operators A and B commutate on some dummy function f(x) = 2*x
#[A,B](2x) =?= 0
def commutate(A,B):
f = lambda x: 2*x
if lambda x: A(B(f)) - B(A(f)) == 0:
我对哈斯克尔很陌生,只是玩了一会儿。
我编写了一个轻量级的OOP仿真:
--OOP.hs
{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, UndecidableInstances, ScopedTypeVariables, FunctionalDependencies #-}
module OOP where
class Provides obj iface where
provide::obj->iface
(#>)::obj->(iface->a)->a
o #>
我正在试着解决这个问题。希望有人能帮上忙。
假设我们有一个名为Confusion的程序;
Program confusion
if(Virus-Finder(Confusion) = false) then
infect-executable
else
halt
End program confusion
显然这是伪代码,所以不会运行。
对于任何程序P,我们可以运行Virus-Finder(P),如果是病毒,则结果为True,如果不是,则结果为False。
infect-executable是一个模块,它扫描内存中的可执行程序,并在这些可执行程序中复制程序Confusion。
我们
我在想的是证据不相关的问题。一份可以证明的声明说:
如果一种类型的相等是可判定的,那么平等语句只能有一个证明,即自反性。
我想知道是否有可能在COQ中使用多个等式证明来构造类型。因此,我会问,下面的构造是否一致?
(*it is known that f=g is undecidable in COQ *)
Definition f(n:nat) := n.
Definition g(n:nat) := n+0.
Axiom p1: f=g.
Axiom p2: f=g.
Axiom nonirrelevance:p1<>p2.
我在这里困惑的是,通过引入p1,
Inductive ty: Set :=
| I
| O.
Definition f (x: ty) (y: ty): nat :=
if x = y then 0 else 1.
我希望函数f比较ty类型的两个术语,但是它没有编译,我看到了这个错误:
术语x = y有Prop类型,它不是(共同)归纳类型.
对于自然数nat这样的简单归纳型,很容易证明两个构造函数(0和后继)给出了所有可能的自然数,
Lemma nat_destruct (n : nat) : n = O \/ exists m : nat, n = S m.
Proof.
destruct n. left. reflexivity. right. exists n. reflexivity.
Qed.
然而,我听说平等证明并不是那么简单。只有一个等式构造函数eq_refl,但是Coq不能证明
eq_destruct : forall (A : Type) (x : A) (prEq : x = x), prEq = eq_r
下面的Coq陈述应该是建设性的:
Require Import Decidable.
Lemma dec_search_nat_counterexample (P : nat -> Prop) (decH : forall i, decidable (P i))
: (~ (forall i, P i)) -> exists i, ~ P i.
如果有一个上限,我希望能够显示某种形式的东西“假设不是每个i < N都满足P i,那么就有一个i < N ~ P i”。实际上,您可以编写一个函数,通过从零开始搜索来找到一个最小的示例。
当然,最初的声明没有上限,但我觉得