hobbes
a language, embedded compiler, and runtime for efficient dynamic expression evaluation, data storage and analysis
tyunqualify.H
Go to the documentation of this file.
1 
2 #ifndef HOBBES_LANG_TYUNQUALIFY_HPP_INCLUDED
3 #define HOBBES_LANG_TYUNQUALIFY_HPP_INCLUDED
4 
5 #include <hobbes/lang/type.H>
6 #include <hobbes/lang/expr.H>
8 #include <memory>
9 
10 namespace hobbes {
11 
12 typedef std::set<std::string> SymSet;
13 
14 // how do some parameters of a constraint determine others?
15 typedef std::vector<int> VarIDs;
16 typedef std::pair<VarIDs, int> FunDep;
17 typedef std::vector<FunDep> FunDeps;
18 
19 // if E :: T and R.satisfied(T), then R.unqualify(E)
20 struct Unqualifier {
21  // bind any implied type variables in a constraint
22  virtual bool refine(const TEnvPtr& tenv, const ConstraintPtr& cst, MonoTypeUnifier* u, Definitions* ds) = 0;
23 
24  // determine whether or not this constraint is satisfied
25  virtual bool satisfied(const TEnvPtr& tenv, const ConstraintPtr& cst, Definitions* ds) const = 0;
26 
27  // determine whether or not it's possible to satisfy this constraint
28  virtual bool satisfiable(const TEnvPtr& tenv, const ConstraintPtr& cst, Definitions* ds) const = 0;
29 
30  // why couldn't this constraint be eliminated?
31  virtual void explain(const TEnvPtr&, const ConstraintPtr&, const ExprPtr&, Definitions*, annmsgs*) = 0;
32 
33  // resolve a qualified expression
34  virtual ExprPtr unqualify(const TEnvPtr& tenv, const ConstraintPtr& cst, const ExprPtr& e, Definitions* ds) const = 0;
35 
36  // allow overloaded symbols (as in type classes)
37  virtual PolyTypePtr lookup(const std::string& vn) const = 0;
38 
39  // list overloaded symbols (if any)
40  virtual SymSet bindings() const = 0;
41 
42  // list functional dependencies between constraint parameters (if any)
43  virtual FunDeps dependencies(const ConstraintPtr&) const = 0;
44 };
45 typedef std::shared_ptr<Unqualifier> UnqualifierPtr;
46 
47 // type predicates are resolved by an assumed disjoint set of unqualifiers
48 class UnqualifierSet : public Unqualifier {
49 public:
50  typedef std::map<std::string, UnqualifierPtr> Unqualifiers;
51 
52  void add(const std::string& name, const UnqualifierPtr& uq);
53  UnqualifierPtr findUnqualifier(const std::string& name);
54  const Unqualifiers& unqualifiers() const;
55 
57  bool satisfied(const TEnvPtr&,const ConstraintPtr&,Definitions*) const;
58  bool satisfiable(const TEnvPtr&,const ConstraintPtr&,Definitions*) const;
59  void explain(const TEnvPtr&, const ConstraintPtr&, const ExprPtr&, Definitions*, annmsgs*);
60  ExprPtr unqualify(const TEnvPtr&,const ConstraintPtr&, const ExprPtr&, Definitions*) const;
61  PolyTypePtr lookup(const std::string& vn) const;
62  SymSet bindings() const;
63  FunDeps dependencies(const ConstraintPtr&) const;
64 private:
65  Unqualifiers uqs;
66 };
67 typedef std::shared_ptr<UnqualifierSet> UnqualifierSetPtr;
68 
69 // utilities to remove discharged type predicates
70 bool hasConstraint(const ConstraintPtr& c, const Constraints& cs);
71 bool hasConstraint(const ConstraintPtr& c, const QualTypePtr& qt);
72 
75 
76 // if possible, this procedure will eliminate predicates in qualified types and apply the necessary term transformations
77 // in the process, new definitions may need to be introduced (in which case they'll be inserted in the supplied array)
78 ExprPtr unqualifyTypes(const TEnvPtr& tenv, const ExprPtr& e, Definitions* ds);
79 
80 }
81 
82 #endif
83 
std::shared_ptr< PolyType > PolyTypePtr
Definition: type.H:23
virtual PolyTypePtr lookup(const std::string &vn) const =0
Definition: tyunqualify.H:20
std::map< std::string, UnqualifierPtr > Unqualifiers
Definition: tyunqualify.H:50
Definition: tyunqualify.H:48
Unqualifiers uqs
Definition: tyunqualify.H:65
std::set< std::string > SymSet
Definition: tyunqualify.H:12
virtual SymSet bindings() const =0
Definition: boot.H:7
bool hasConstraint(const ConstraintPtr &c, const Constraints &cs)
Definition: typepreds.C:100
std::vector< FunDep > FunDeps
Definition: tyunqualify.H:17
Constraints removeConstraint(const ConstraintPtr &c, const Constraints &cs)
Definition: typepreds.C:114
ExprPtr unqualifyTypes(const TEnvPtr &tenv, const ExprPtr &e, Definitions *ds)
Definition: tyunqualify.C:8
virtual void explain(const TEnvPtr &, const ConstraintPtr &, const ExprPtr &, Definitions *, annmsgs *)=0
std::shared_ptr< Unqualifier > UnqualifierPtr
Definition: type.H:83
Definition: typeinf.H:29
std::vector< ConstraintPtr > Constraints
Definition: type.H:35
std::shared_ptr< Expr > ExprPtr
Definition: expr.H:58
std::shared_ptr< TEnv > TEnvPtr
Definition: type.H:80
std::pair< VarIDs, int > FunDep
Definition: tyunqualify.H:16
std::vector< Definition > Definitions
Definition: expr.H:62
std::shared_ptr< UnqualifierSet > UnqualifierSetPtr
Definition: type.H:86
std::vector< int > VarIDs
Definition: tyunqualify.H:15
std::shared_ptr< Constraint > ConstraintPtr
Definition: type.H:33
virtual FunDeps dependencies(const ConstraintPtr &) const =0
virtual bool refine(const TEnvPtr &tenv, const ConstraintPtr &cst, MonoTypeUnifier *u, Definitions *ds)=0
virtual bool satisfied(const TEnvPtr &tenv, const ConstraintPtr &cst, Definitions *ds) const =0
std::shared_ptr< QualType > QualTypePtr
Definition: type.H:28
virtual bool satisfiable(const TEnvPtr &tenv, const ConstraintPtr &cst, Definitions *ds) const =0
std::vector< annmsg > annmsgs
Definition: lannotation.H:58
virtual ExprPtr unqualify(const TEnvPtr &tenv, const ConstraintPtr &cst, const ExprPtr &e, Definitions *ds) const =0