souffle  2.0.2-371-g6315b36
Public Member Functions | Private Member Functions
souffle::ast::transform::ResolveAnonymousRecordAliasesTransformer Class Reference

Transformer resolving aliases for anonymous records. More...

#include <ResolveAnonymousRecordAliases.h>

Inheritance diagram for souffle::ast::transform::ResolveAnonymousRecordAliasesTransformer:
Inheritance graph
Collaboration diagram for souffle::ast::transform::ResolveAnonymousRecordAliasesTransformer:
Collaboration graph

Public Member Functions

ResolveAnonymousRecordAliasesTransformerclone () const override
 
std::string getName () const override
 
- Public Member Functions inherited from souffle::ast::transform::Transformer
bool apply (TranslationUnit &translationUnit)
 
virtual ~Transformer ()=default
 

Private Member Functions

std::map< std::string, const RecordInit * > findVariablesRecordMapping (TranslationUnit &, const Clause &)
 For each variable equal to some anonymous record, assign a value of that record. More...
 
bool replaceNamedVariables (TranslationUnit &, Clause &)
 Use mapping found by findVariablesRecordMapping to substitute a records for each variable that operates on records. More...
 
bool replaceUnnamedVariable (Clause &)
 For unnamed variables, replace each equation _ op record with true. More...
 
bool transform (TranslationUnit &translationUnit) override
 

Detailed Description

Transformer resolving aliases for anonymous records.

The transformer works by searching the clause for equalities of the form a = [...], where a is an anonymous record, and replacing all occurrences of a with the RHS.

The transformer is to be called in conjunction with FoldAnonymousRecords.

Definition at line 39 of file ResolveAnonymousRecordAliases.h.

Member Function Documentation

◆ clone()

ResolveAnonymousRecordAliasesTransformer* souffle::ast::transform::ResolveAnonymousRecordAliasesTransformer::clone ( ) const
inlineoverridevirtual

◆ findVariablesRecordMapping()

std::map< std::string, const RecordInit * > souffle::ast::transform::ResolveAnonymousRecordAliasesTransformer::findVariablesRecordMapping ( TranslationUnit tu,
const Clause clause 
)
private

For each variable equal to some anonymous record, assign a value of that record.

Definition at line 44 of file ResolveAnonymousRecordAliases.cpp.

44  { return isA<ast::Variable>(node); };
45  auto isRecord = [](Node* node) -> bool { return isA<RecordInit>(node); };
46 
47  auto& typeAnalysis = *tu.getAnalysis<analysis::TypeAnalysis>();
48  auto groundedTerms = analysis::getGroundedTerms(tu, clause);
49 
50  for (auto* literal : clause.getBodyLiterals()) {
51  if (auto constraint = dynamic_cast<BinaryConstraint*>(literal)) {
52  if (!isEqConstraint(constraint->getBaseOperator())) {
53  continue;
54  }
55 
56  auto left = constraint->getLHS();
57  auto right = constraint->getRHS();
58 
59  if (!isVariable(left) && !isVariable(right)) {
60  continue;
61  }
62 
63  if (!isRecord(left) && !isRecord(right)) {
64  continue;
65  }
66 
67  // TODO (darth_tytus): This should change in the future.
68  // Currently type system assigns to anonymous records {- All types - }
69  // which is inelegant.
70  if (!typeAnalysis.getTypes(left).isAll()) {
71  continue;
72  }
73 
74  auto* variable = static_cast<ast::Variable*>(isVariable(left) ? left : right);
75  const auto& variableName = variable->getName();
76 
77  if (!groundedTerms.find(variable)->second) {
78  continue;
79  }
80 
81  // We are interested only in the first mapping.
82  if (variableRecordMap.find(variableName) != variableRecordMap.end()) {
83  continue;
84  }
85 
86  auto* record = static_cast<RecordInit*>(isRecord(left) ? left : right);
87 
88  variableRecordMap.insert({variableName, record});
89  }
90  }
91 
92  return variableRecordMap;
93 }
94 
95 bool ResolveAnonymousRecordAliasesTransformer::replaceNamedVariables(TranslationUnit& tu, Clause& clause) {
96  struct ReplaceVariables : public NodeMapper {
97  std::map<std::string, const RecordInit*> varToRecordMap;

◆ getName()

std::string souffle::ast::transform::ResolveAnonymousRecordAliasesTransformer::getName ( ) const
inlineoverridevirtual

Implements souffle::ast::transform::Transformer.

Definition at line 45 of file ResolveAnonymousRecordAliases.h.

45  :
46  bool transform(TranslationUnit& translationUnit) override;
47 

◆ replaceNamedVariables()

bool souffle::ast::transform::ResolveAnonymousRecordAliasesTransformer::replaceNamedVariables ( TranslationUnit tu,
Clause clause 
)
private

Use mapping found by findVariablesRecordMapping to substitute a records for each variable that operates on records.

Definition at line 99 of file ResolveAnonymousRecordAliases.cpp.

100  : varToRecordMap(std::move(varToRecordMap)){};
101 
102  Own<Node> operator()(Own<Node> node) const override {
103  if (auto variable = dynamic_cast<ast::Variable*>(node.get())) {
104  auto iteratorToRecord = varToRecordMap.find(variable->getName());
105  if (iteratorToRecord != varToRecordMap.end()) {
106  return souffle::clone(iteratorToRecord->second);
107  }
108  }
109 
110  node->apply(*this);
111 
112  return node;
113  }
114  };
115 
116  auto variableToRecordMap = findVariablesRecordMapping(tu, clause);
117  bool changed = variableToRecordMap.size() > 0;
118  if (changed) {
119  ReplaceVariables update(std::move(variableToRecordMap));
120  clause.apply(update);
121  }
122  return changed;
123 }
124 
126  struct ReplaceUnnamed : public NodeMapper {
127  mutable bool changed{false};

◆ replaceUnnamedVariable()

bool souffle::ast::transform::ResolveAnonymousRecordAliasesTransformer::replaceUnnamedVariable ( Clause clause)
private

For unnamed variables, replace each equation _ op record with true.

Definition at line 129 of file ResolveAnonymousRecordAliases.cpp.

130  {
131  auto isUnnamed = [](Node* node) -> bool { return isA<UnnamedVariable>(node); };
132  auto isRecord = [](Node* node) -> bool { return isA<RecordInit>(node); };
133 
134  if (auto constraint = dynamic_cast<BinaryConstraint*>(node.get())) {
135  auto left = constraint->getLHS();
136  auto right = constraint->getRHS();
137  bool hasUnnamed = isUnnamed(left) || isUnnamed(right);
138  bool hasRecord = isRecord(left) || isRecord(right);
139  auto op = constraint->getBaseOperator();
140  if (hasUnnamed && hasRecord && isEqConstraint(op)) {
141  return mk<BooleanConstraint>(true);
142  }
143  }
144 
145  node->apply(*this);
146 
147  return node;
148  }
149  };
150 
151  ReplaceUnnamed update;
152  clause.apply(update);
153 
154  return update.changed;
155 }
156 
157 bool ResolveAnonymousRecordAliasesTransformer::transform(TranslationUnit& translationUnit) {
158  bool changed = false;
159  Program& program = translationUnit.getProgram();

References souffle::isEqConstraint().

Here is the call graph for this function:

◆ transform()

bool souffle::ast::transform::ResolveAnonymousRecordAliasesTransformer::transform ( TranslationUnit translationUnit)
overrideprivatevirtual

The documentation for this class was generated from the following files:
souffle::ast::transform::ResolveAnonymousRecordAliasesTransformer::replaceNamedVariables
bool replaceNamedVariables(TranslationUnit &, Clause &)
Use mapping found by findVariablesRecordMapping to substitute a records for each variable that operat...
Definition: ResolveAnonymousRecordAliases.cpp:99
souffle::ast::analysis::getGroundedTerms
std::map< const Argument *, bool > getGroundedTerms(const TranslationUnit &tu, const Clause &clause)
Analyse the given clause and computes for each contained argument whether it is a grounded value or n...
Definition: Ground.cpp:278
souffle::clone
auto clone(const std::vector< A * > &xs)
Definition: ContainerUtil.h:172
souffle::ast::transform::ResolveAnonymousRecordAliasesTransformer::transform
bool transform(TranslationUnit &translationUnit) override
Definition: ResolveAnonymousRecordAliases.cpp:161
souffle::isEqConstraint
bool isEqConstraint(const BinaryConstraintOp constraintOp)
Definition: BinaryConstraintOps.h:124
souffle::ast::transform::ResolveAnonymousRecordAliasesTransformer::replaceUnnamedVariable
bool replaceUnnamedVariable(Clause &)
For unnamed variables, replace each equation _ op record with true.
Definition: ResolveAnonymousRecordAliases.cpp:129
souffle::ast::transform::ResolveAnonymousRecordAliasesTransformer::findVariablesRecordMapping
std::map< std::string, const RecordInit * > findVariablesRecordMapping(TranslationUnit &, const Clause &)
For each variable equal to some anonymous record, assign a value of that record.
Definition: ResolveAnonymousRecordAliases.cpp:44