Advertisement
Guest User

Untitled

a guest
Feb 8th, 2016
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.92 KB | None | 0 0
  1. Definition pred (T : Type) := T -> bool.
  2.  
  3. CoInductive mem_pred (T : Type) : Type := Mem : pred T -> mem_pred T.
  4.  
  5. Definition isMem (T : Type) pT topred mem :=
  6. mem = (fun p : pT => Mem T (fun x => topred p x)).
  7.  
  8. Record predType (T : Type) := PredType {
  9. pred_sort :> Type;
  10. topred : pred_sort -> pred T;
  11. _ : {mem | isMem _ _ topred mem}
  12. }.
  13.  
  14. Definition mem (T : Type) (pT : predType T) : pT -> mem_pred T :=
  15. match pT return pT -> _ with
  16. | PredType _ _ _ (exist _ mem _) => mem
  17. end.
  18.  
  19. Definition predPredType (T : Type) :=
  20. PredType T (pred T) (fun x => x)
  21. (exist (isMem T (pred T) (fun x => x))
  22. (fun p => @Mem T (fun x : T => p x)) (eq_refl _)).
  23.  
  24. Module Type PredSig.
  25. Parameter mkPred : forall T, (T -> bool) -> predPredType T.
  26. End PredSig.
  27.  
  28. Module Pred : PredSig.
  29. Definition mkPred T (p : T -> bool) := p.
  30. End Pred.
  31.  
  32. Definition x :=
  33. mem unit (predPredType unit) (Pred.mkPred _ (fun _ => true)).
  34.  
  35. Extraction "hoge.ml" x.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement