diff options
Diffstat (limited to 'lib/concepts')
| -rw-r--r-- | lib/concepts/Mode.ml | 34 | ||||
| -rw-r--r-- | lib/concepts/Mode.mli | 27 |
2 files changed, 18 insertions, 43 deletions
diff --git a/lib/concepts/Mode.ml b/lib/concepts/Mode.ml index b7aa814..82c207f 100644 --- a/lib/concepts/Mode.ml +++ b/lib/concepts/Mode.ml @@ -1,30 +1,18 @@ -type attribute = string type attributes = BatSet.String.t -type affordance = Decides | Generates of Cardinality.t -type mode = {bound: attributes; affords: affordance} +type mode = {bound: attributes; yields: Cardinality.t} type t = mode list -let attributes_of_list = BatSet.String.of_list -let attributes_of_map map = BatMap.String.keys map |> BatSet.String.of_enum -let decides_when bound = {bound= attributes_of_list bound; affords= Decides} -let enumerable cardinality = {bound= BatSet.String.empty; affords= Generates cardinality} -let of_list modes = modes +let mode bound yields = {bound= BatSet.String.of_list bound; yields} -let generation declaration bound = +let generation modes bound = List.fold_left - (fun tightest {bound= declared; affords} -> - match affords with - | Generates cardinality when BatSet.String.subset declared bound -> - Some (Option.fold ~none:cardinality ~some:(Cardinality.meet cardinality) tightest) - | Generates _ | Decides -> tightest ) - None declaration + (fun tightest {bound= declared; yields} -> + if BatSet.String.subset declared bound then + Some (Option.fold ~none:yields ~some:(Cardinality.meet yields) tightest) + else tightest ) + None modes -let exhaustible declaration bound = - Option.fold ~none:false ~some:Cardinality.exhaustible (generation declaration bound) +let exhaustible modes bound = + Option.fold ~none:false ~some:Cardinality.exhaustible (generation modes bound) -let decision declaration bound = - exhaustible declaration bound - || List.exists - (fun {bound= declared; affords} -> - match affords with Decides -> BatSet.String.equal declared bound | Generates _ -> false ) - declaration +let project attributes = List.filter (fun {bound; _} -> BatSet.String.subset bound attributes) diff --git a/lib/concepts/Mode.mli b/lib/concepts/Mode.mli index 6a906d1..d91b2ab 100644 --- a/lib/concepts/Mode.mli +++ b/lib/concepts/Mode.mli @@ -1,27 +1,14 @@ -type attribute = string type attributes = BatSet.String.t -(** what asking a relation under a given set of bound attributes - affords. The answer is to whether anything satisfies the binding, - or the bindings of the attributes left free together with the - class of what is produced. *) -type affordance = Decides | Generates of Cardinality.t +(** given [bound], every matching tuple can be produced, and there are + at most [yields]. *) +type mode = {bound: attributes; yields: Cardinality.t} -type mode = {bound: attributes; affords: affordance} -type t +type t = mode list -val attributes_of_list : attribute list -> attributes -val attributes_of_map : 'a BatMap.String.t -> attributes -val decides_when : attribute list -> mode -val enumerable : Cardinality.t -> mode -val of_list : mode list -> t - -(** the tightest class declared for generating under [bound]. A mode - declared for fewer bound attributes applies to more, since the - attributes left free are then fewer and no more numerous. *) +val mode : string list -> Cardinality.t -> mode val generation : t -> attributes -> Cardinality.t option - val exhaustible : t -> attributes -> bool -(** declared outright, or implied by a generation that can be exhausted. *) -val decision : t -> attributes -> bool +(** the modes still usable when only [attributes] can be bound. *) +val project : attributes -> t -> t |
