Advertisement
Guest User

Untitled

a guest
May 2nd, 2024
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.27 KB | None | 0 0
  1. Inductive predicate_polynomial : Set :=
  2. | Pred : (nat -> bool) -> predicate_polynomial
  3. | PredVar : nat -> predicate_polynomial
  4. | PredInter : predicate_polynomial -> predicate_polynomial -> predicate_polynomial
  5. | PredSymdiff : predicate_polynomial -> predicate_polynomial -> predicate_polynomial
  6. | PredBot : predicate_polynomial
  7. | PredTop : predicate_polynomial
  8. .
  9.  
  10. Inductive pred_poly_eq : predicate_polynomial -> predicate_polynomial -> Prop :=
  11. | pred_poly_refl : forall (p : predicate_polynomial), pred_poly_eq p p
  12. | pred_poly_sym : forall p q, pred_poly_eq p q -> pred_poly_eq q p
  13. | pred_poly_trans : forall p q r, pred_poly_eq p q -> pred_poly_eq q r -> pred_poly_eq p r
  14.  
  15. | pred_poly_inter_morph : forall p p', pred_poly_eq p p' ->
  16. forall q q', pred_poly_eq q q' -> pred_poly_eq (PredInter p q) (PredInter p' q')
  17. | pred_poly_sym_morph : forall p p', pred_poly_eq p p' ->
  18. forall q q', pred_poly_eq q q' -> pred_poly_eq (PredSymdiff p q) (PredSymdiff p' q')
  19.  
  20. | pred_poly_inter_comm : forall p q, pred_poly_eq (PredInter p q) (PredInter q p)
  21. | pred_poly_inter_assoc : forall p q r,
  22. pred_poly_eq (PredInter p (PredInter q r)) (PredInter (PredInter p q) r)
  23. | pred_poly_inter_unit : forall p, pred_poly_eq (PredInter PredTop p) p
  24. | pred_poly_iter_idem : forall p, pred_poly_eq (PredInter p p) p
  25.  
  26. | pred_poly_sym_comm : forall p q, pred_poly_eq (PredSymdiff p q) (PredSymdiff q p)
  27. | pred_poly_sym_assoc : forall p q r,
  28. pred_poly_eq (PredSymdiff p (PredSymdiff q r)) (PredSymdiff (PredSymdiff p q) r)
  29. | pred_poly_sym_unit : forall p, pred_poly_eq (PredSymdiff PredBot p) p
  30. | pred_poly_sym_nil : forall p, pred_poly_eq (PredSymdiff p p) PredBot
  31.  
  32. | pred_poly_left_distr : forall p q r,
  33. pred_poly_eq (PredInter (PredSymdiff p q) r) (PredSymdiff (PredInter p r) (PredInter q r))
  34. .
  35.  
  36. Fixpoint interp (p : predicate_polynomial) (x : nat) : bool :=
  37. match p with
  38. | Pred f => f x
  39. | PredVar _ => false (* todo variable substitution *)
  40. | PredInter p1 p2 => (interp p1 x) && (interp p2 x)
  41. | PredSymdiff p1 p2 => xorb (interp p1 x) (interp p2 x)
  42. | PredBot => false
  43. | PredTop => true
  44. end.
  45.  
  46. Theorem interp_respects : forall p1 p2 x, pred_poly_eq p1 p2 -> interp p1 x = interp p2 x.
  47. Proof.
  48. intros p1 p2 x H.
  49. induction H; cbn [interp].
  50. - eauto.
  51. - eauto.
  52. - transitivity (interp q x); eauto.
  53. - rewrite IHpred_poly_eq1, IHpred_poly_eq2; eauto.
  54. - rewrite IHpred_poly_eq1, IHpred_poly_eq2; eauto.
  55. - destruct (interp p x), (interp q x); eauto.
  56. - destruct (interp p x), (interp q x); eauto.
  57. - destruct (interp p x); eauto.
  58. - destruct (interp p x); eauto.
  59. - destruct (interp p x), (interp q x); eauto.
  60. - destruct (interp p x), (interp q x), (interp r x); eauto.
  61. - destruct (interp p x); eauto.
  62. - destruct (interp p x); eauto.
  63. - destruct (interp p x), (interp q x), (interp r x); eauto.
  64. Qed.
  65.  
  66. Lemma silly : (forall a, Nat.eqb a a = true).
  67. Proof.
  68. intros a; induction a; cbn [Nat.eqb]; eauto.
  69. Qed.
  70.  
  71. Theorem thm1: forall x,
  72. pred_poly_eq (Pred (Nat.eqb x)) PredBot -> False.
  73. Proof.
  74. intros.
  75. assert (interp (Pred (Nat.eqb x)) x = interp PredBot x) as H0.
  76. - apply interp_respects; eauto.
  77. - cbv [interp] in H0.
  78. assert (Nat.eqb x x = true) by apply silly.
  79. congruence.
  80. Qed.
  81.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement