2 | import Language.Reflection.Util
11 | minusClaim : Visibility -> (fun : Name) -> (p : ParamTypeInfo) -> Decl
12 | minusClaim vis fun p =
13 | let arg := p.applied
14 | tpe := piAll `(~(arg) -> ~(arg) -> ~(arg)) (allImplicits p "Neg")
15 | in simpleClaim vis fun tpe
18 | negClaim : Visibility -> (fun : Name) -> (p : ParamTypeInfo) -> Decl
19 | negClaim vis fun p =
20 | let arg := p.applied
21 | tpe := piAll `(~(arg) -> ~(arg)) (allImplicits p "Neg")
22 | in simpleClaim vis fun tpe
25 | negImplClaim : Visibility -> (impl : Name) -> (p : ParamTypeInfo) -> Decl
26 | negImplClaim v impl p = implClaimVis v impl (implType "Neg" p)
32 | negImplDef : (neg, min, impl : Name) -> Decl
33 | negImplDef neg min impl =
34 | def impl [patClause (var impl) (appNames "MkNeg" [neg, min])]
36 | minus : BoundArg 2 Explicit -> TTImp
37 | minus (BA arg [x,y] _) = `(~(var x) -
~(var y))
39 | neg : BoundArg 1 Explicit -> TTImp
40 | neg (BA arg [x] _) = `(negate
~(var x))
43 | minusDef : Name -> Con n vs -> Decl
45 | let clause := mapArgs2 explicit (\x,y => `(~(var fun) ~(x) ~(y))) minus c
49 | negDef : Name -> Con n vs -> Decl
51 | let clause := mapArgs explicit (var fun `app`) neg c
61 | NegVis : Visibility -> List Name -> ParamTypeInfo -> Res (List TopLevel)
62 | NegVis vis nms p = case p.info.cons of
64 | let neg := funName p "negate"
65 | minus := funName p "minus"
66 | impl := implName p "Neg"
68 | [ TL (negClaim vis neg p) (negDef neg c)
69 | , TL (minusClaim vis minus p) (minusDef minus c)
70 | , TL (negImplClaim vis impl p) (negImplDef neg minus impl)
72 | _ => failRecord "Neg"
76 | Neg : List Name -> ParamTypeInfo -> Res (List TopLevel)