- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试使用 Function 来使用度量来定义递归定义,但收到错误:
Error: find_call_occs : Prod
我在底部发布了整个源代码,但我的功能是
Function kripke_sat (M : kripke) (s : U) (p : formula) {measure size p}: Prop :=
match p with
| Proposition p' => L M (s)(p')
| Not p' => ~ kripke_sat M s p'
| And p' p'' => kripke_sat M s p' /\ kripke_sat M s p''
| Or p' p'' => kripke_sat M s p' \/ kripke_sat M s p''
| Implies p' p'' => ~kripke_sat M s p' \/ kripke_sat M s p''
| Knows a p' => forall t, ~(K M a) s t \/ kripke_sat M t p'
| EvKnows p' => forall i, kripke_sat M s (Knows i p' )
end.
我知道问题是由于 foralls 造成的:如果我用 True 替换它们,它就可以工作。我还知道如果我的右侧使用含义(->),我会得到同样的错误。Fixpoint 可与 foralls 配合使用,但不允许我定义度量。
有什么建议吗?
正如所 promise 的,我的完整代码是:
Module Belief.
Require Import Arith.EqNat.
Require Import Arith.Gt.
Require Import Arith.Plus.
Require Import Arith.Le.
Require Import Arith.Lt.
Require Import Logic.
Require Import Logic.Classical_Prop.
Require Import Init.Datatypes.
Require Import funind.Recdef.
(* Formalization of a variant of a logic of knowledge, as given in Halpern 1995 *)
Section Kripke.
Variable n : nat.
(* Universe of "worlds" *)
Definition U := nat.
(* Universe of Principals *)
Definition P := nat.
(* Universe of Atomic propositions *)
Definition A := nat.
Inductive prop : Type :=
| Atomic : A -> prop.
Definition beq_prop (p1 p2 :prop) : bool :=
match (p1,p2) with
| (Atomic p1', Atomic p2') => beq_nat p1' p2'
end.
Inductive actor : Type :=
| Id : P -> actor.
Definition beq_actor (a1 a2: actor) : bool :=
match (a1,a2) with
| (Id a1', Id a2') => beq_nat a1' a2'
end.
Inductive formula : Type :=
| Proposition : prop -> formula
| Not : formula -> formula
| And : formula -> formula -> formula
| Or : formula -> formula -> formula
| Implies : formula -> formula ->formula
| Knows : actor -> formula -> formula
| EvKnows : formula -> formula (*me*)
.
Inductive con : Type :=
| empty : con
| ext : con -> prop -> con.
Notation " C # P " := (ext C P) (at level 30).
Require Import Relations.
Record kripke : Type := mkKripke {
K : actor -> relation U;
K_equiv: forall y, equivalence _ (K y);
L : U -> (prop -> Prop)
}.
Fixpoint max (a b: nat) : nat :=
match a, b with
| 0, _ => a
| _, 0 => b
| S(a'), S(b') => 1 + max a' b'
end.
Fixpoint length (p: formula) : nat :=
match p with
| Proposition p' => 1
| Not p' => 1 + length(p')
| And p' p'' => 1 + max (length p') (length p'')
| Or p' p'' => 1 + max (length p') (length p'')
| Implies p' p'' => 1 + max (length p') (length p'')
| Knows a p' => 1 + length(p')
| EvKnows p' => 1 + length(p')
end.
Fixpoint numKnows (p: formula): nat :=
match p with
| Proposition p' => 0
| Not p' => 0 + numKnows(p')
| And p' p'' => 0 + max (numKnows p') (numKnows p'')
| Or p' p'' => 0 + max (numKnows p') (numKnows p'')
| Implies p' p'' => 0 + max (numKnows p') (numKnows p'')
| Knows a p' => 0 + numKnows(p')
| EvKnows p' => 1 + numKnows(p')
end.
Definition size (p: formula): nat :=
(numKnows p) + (length p).
Definition twice (n: nat) : nat :=
n + n.
Theorem duh: forall a: nat, 1 + a > a.
Proof. induction a. apply gt_Sn_O.
apply gt_n_S in IHa. unfold plus in *. apply IHa. Qed.
Theorem eq_lt_lt: forall (a b c d: nat), a = b -> c<d -> a+ c< b+d.
Proof. intros. apply plus_le_lt_compat.
apply eq_nat_elim with (n:=a) (m := b). apply le_refl.
apply eq_nat_is_eq. apply H. apply H0. Qed.
Function kripke_sat (M : kripke) (s : U) (p : formula) {measure size p}: Prop :=
match p with
| Proposition p' => L M (s)(p')
| Not p' => ~ kripke_sat M s p'
| And p' p'' => kripke_sat M s p' /\ kripke_sat M s p''
| Or p' p'' => kripke_sat M s p' \/ kripke_sat M s p''
| Implies p' p'' => ~kripke_sat M s p' \/ kripke_sat M s p''
| Knows a p' => forall t, ~(K M a) s t \/ kripke_sat M t p'
| EvKnows p' => forall i, kripke_sat M s (Knows i p' )
end.
最佳答案
“Function”插件仍处于实验阶段。在文档中您可以找到
term0 must be build as a pure pattern-matching tree (match...with) with λ-abstractions and applications only at the end of each branch.
但我必须承认这个错误消息远非明确(通常此类错误消息应以“请报告”结尾,或者是更多用户信息友好,我认为这是一个错误)。这意味着函数体内不允许使用 forall(我不知道这种行为是否有理论上的原因)。
所以你需要在没有帮助的情况下“手动”进行定义功能。这是一个小例子,您可以根据自己的开发进行调整。祝你好运 !
Inductive form : Set :=
| T : form
| K : nat -> form -> form
| eK : form -> form.
Fixpoint size (f : form) : nat := match f with
| T => 1
| K _ f => S (size f)
| eK f => S (S (size f))
end.
Require Import Wf.
Require Import Wf_nat.
Definition R x y := size x < size y.
Lemma R_wf : well_founded R.
apply well_founded_ltof.
Qed.
Lemma lem1 :
forall x n, R x (K n x).
unfold R; intuition.
Qed.
Lemma lem2 :
forall x n, R (K n x) (eK x).
unfold R; intuition.
Qed.
Definition interpret : form -> Prop.
(* we use the well_founded_induction instead of Function *)
refine (well_founded_induction_type R_wf (fun _ => Prop) (fun x f => _)).
destruct x.
exact True. (* ⟦T⟧ ≡ True *)
exact (n = 2 /\ f x (lem1 x n)). (* ⟦K n F⟧ ≡ (n = 2) ∧ ⟦F⟧ *)
exact (forall n:nat, f (K n x) (lem2 x n)). (* ⟦eK F⟧ ≡ ∀n:nat,⟦K n F⟧ *)
Defined.
PS:我将使用以下更简单版本的代码来填写错误报告。
Require Import Recdef.
Inductive I : Set :=
| C : I.
Definition m (_ : I) := 0.
Function f (x : I) {measure m x} : Type := match x with
| C => nat -> nat end.
关于coq - 在递归函数定义中使用 forall,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4432762/
标题和标签应充分解释问题。 最佳答案 Title and tags should explain the question adequately. 呃,不是真的。您使用了标签 existential-
以 Haskell 中简单的恒等函数为例, id :: forall a. a -> a 鉴于 Haskell 据称支持谓语多态性,我应该能够将 id“限制”为类型 (forall a.a -> a)
Ltac checkForall H := let T := type of H in match T with | forall x, ?P x => idtac | _ =
如何在 Coq 中证明 (forall x, P x/\Q x) -> (forall x, P x)?已经尝试了几个小时,但不知道如何分解 Coq 可以消化的东西的前因。 (我是新手,显然:) 最佳
是否可以编写类型的单射函数 hard :: (forall n . Maybe (f n)) -> Maybe (forall n . (f n)) 作为total functional progra
我试图理解使用 forall 量化两个类型变量和使用 forall 量化元组类型的单个类型变量之间的区别。 例如,给定以下类型系列: {-# LANGUAGE RankNTypes #-} {-# L
在证明中,我需要证明“如果 n 不是三的倍数,那么 n+n 也不是三的倍数”。我认为我的证明太长而且不是很优雅。有没有更漂亮的写法?有没有ssreflect? (我确定 ssreflect 中有一个
从我收集到的有关 agda 的零碎信息中,我(显然是错误地)得出的结论是 ∀ {A}相当于 {A : Set} .现在我注意到 flip : ∀ {A B C} -> (A -> B -> C) ->
如果我不想查看列表中的每个元素是否与另一个列表中相同索引的元素正确对应,我可以使用 forall 来执行此操作吗?例如类似的东西 val p=List(2,4,6) val q=List(1,2,3)
我尝试使用 Function 来使用度量来定义递归定义,但收到错误: Error: find_call_occs : Prod 我在底部发布了整个源代码,但我的功能是 Function kripke_
我一直在阅读existential section维基教科书中的内容如下: Firstly, forall really does mean 'for all'. One way of thinkin
从 ghc-8.0 开始,我们有一个非常好的扩展,称为 TypeApplications。这允许我们代替: λ> show (5 :: Int) "5" 这样做: λ> :set -XTypeAppl
我阅读了HaskellWiki关于数据构造函数并考虑以下内容: 2.1 Data constructors as first class values Data constructors are fi
我想证明以下定理: Theorem Frobenius (A: Set) (q: Prop) (p: A -> Prop) : (q \/ forall x : A, p x) -> (foral
我遇到了一个函数无法进行类型检查的情况,除非我在其类型签名的开头显式添加一个 forall。 有问题的功能是: test :: (Typeable a) => a -> a test x |
看来需要明确说forall在数据定义中有参数类型。例如,这 data A = A (forall s. ST s (STUArray s Int Int)) 将工作,而这 data A = A (ST
我对哈姆雷特有一个奇怪的问题。我正在尝试使用 $forall 遍历列表,但我不断收到“不在范围内”错误。我在 Win7 上运行 yesod 0.9.2.2。 除了糟糕的设计,有人知道我哪里出错了吗?删
考虑以下表: object MyTestsFactory { val testCases = Table( ("testName", "input", "output"), ("t
我正在通过阅读“Certified Programming with Dependent Types”一书来学习 Coq,但我在理解问题时遇到了问题 forall句法。 举个例子,让我们考虑一下这种相
可以使用 GADT 来表达 Existentially quantified 类型。 我看到 GADT 更通用 - data-type-extensions ,第 7.4.7 节 什么时候使用存在量化
我是一名优秀的程序员,十分优秀!