never executed always true always false
1 {-# LANGUAGE QuasiQuotes #-}
2
3 module Conjure.Rules.Vertical.Permutation.PermutationAsFunction where
4
5 import Conjure.Rules.Import
6
7 rule_Cardinality :: Rule
8 rule_Cardinality = "permutation-cardinality" `namedRule` theRule
9 where
10 theRule po = do
11 p <- match opTwoBars po
12 TypePermutation {} <- typeOf p
13 Permutation_AsFunction <- representationOf p
14 DomainPermutation _ _ innerDom <- domainOf p
15 [fun, _] <- downX1 p
16 return
17 ( "Vertical rule for permutation cardinality, AsFunction representation.",
18 do
19 (iPat, i) <- quantifiedVarOverDomain (forgetRepr innerDom)
20 return [essence| sum([ toInt(&i != image(&fun, &i)) | &iPat : &innerDom ]) |]
21 )
22
23 rule_Defined :: Rule
24 rule_Defined = "permutation-defined" `namedRule` theRule
25 where
26 theRule po = do
27 p <- match opDefined po
28 TypePermutation {} <- typeOf p
29 Permutation_AsFunction <- representationOf p
30 [fun, _] <- downX1 p
31 return
32 ( "Vertical rule for permutation defined, AsFunction representation.",
33 return [essence| defined(&fun) |]
34 )
35
36 rule_Comprehension :: Rule
37 rule_Comprehension = "permutation-comprehension-tuples{AsFunction}" `namedRule` theRule
38 where
39 theRule (Comprehension body gensOrConds) = do
40 (gocBefore, (pat, perm), gocAfter) <- matchFirst gensOrConds $ \case
41 Generator (GenInExpr pat expr) -> return (pat, matchDefs [opToSet] expr)
42 _ -> na "rule_Comprehension"
43 TypePermutation {} <- typeOf perm
44 Permutation_AsFunction <- representationOf perm
45 [f, _] <- downX1 perm
46 return
47 ( "Vertical rule for permutation-comprehension",
48 do
49 (lPat, l) <- quantifiedVar
50 (rPat, r) <- quantifiedVar
51 return
52 $ Comprehension body
53 $ gocBefore
54 ++ [ Generator
55 ( GenInExpr
56 pat
57 [essence| [(&l,&r)
58 | (&lPat, &rPat) <- &f
59 , &l != &r] |]
60 )
61 ]
62 ++ gocAfter
63 )
64 theRule _ = na "rule_Comprehension"
65
66 rule_Image :: Rule
67 rule_Image = "permutation-image{AsFunction}" `namedRule` theRule
68 where
69 theRule [essence| image(&p, &i) |] = do
70 TypePermutation inner <- typeOf p
71 case match permutationLiteral p of
72 Nothing -> do
73 typeI <- typeOf i
74 if let ?typeCheckerMode = StronglyTyped in typesUnify [inner, typeI]
75 then do
76 [f, _] <- downX1 p
77 [values] <- downX1 f
78 return
79 ( "Vertical rule for permutation application to a single value",
80 do
81 return [essence| elementId(&values, &i) |]
82 )
83 else
84 if let ?typeCheckerMode = StronglyTyped in typeI `containsType` inner
85 then na "rule_Image"
86 else
87 return
88 ( "Vertical rule for permutation application to a type the permutation doesn't care about",
89 return i
90 )
91 _ -> na "rule_Image"
92 theRule _ = na "rule_Image"
93
94 rule_Image_permInverse :: Rule
95 rule_Image_permInverse = "permutation-image-permInverse{AsFunction}" `namedRule` theRule
96 where
97 theRule [essence| image(permInverse(&p), &i) |] = do
98 TypePermutation inner <- typeOf p
99 case match permutationLiteral p of
100 Nothing -> do
101 typeI <- typeOf i
102 if let ?typeCheckerMode = StronglyTyped in typesUnify [inner, typeI]
103 then do
104 [_, f] <- downX1 p
105 [values] <- downX1 f
106 return
107 ( "Vertical rule for permutation application to a single value",
108 do
109 return [essence| elementId(&values, &i) |]
110 )
111 else
112 if let ?typeCheckerMode = StronglyTyped in typeI `containsType` inner
113 then na "rule_Image_permInverse"
114 else
115 return
116 ( "Vertical rule for permutation application to a type the permutation doesn't care about",
117 return i
118 )
119 Just (_, [[_, _]]) ->
120 return
121 ( "Vertical rule for permutation application, where the permutation is a literal and contains 2 objects",
122 return [essence| image(&p, &i) |]
123 )
124 _ -> na "rule_Image_permInverse" -- TODO: missing case for permutation literal
125 theRule _ = na "rule_Image_permInverse"
126
127
128 rule_double_permInverse :: Rule
129 rule_double_permInverse = "permutation-image-permInverse{AsFunction}" `namedRule` theRule
130 where
131 theRule [essence| permInverse(permInverse(&p)) |] =
132 return
133 ( "Double permInverse",
134 return p
135 )
136 theRule _ = na "rule_double_permInverse"