Commit 1c87ee0f authored by Sergio Pérez's avatar Sergio Pérez
Browse files

Implicit restrictions added to pattern matching

parent 53c4f341
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -38,7 +38,10 @@ public class LiteralConstraint extends EdgeConstraint {
            return super.wrap(super.push(phase, cs));
        }
        super.check(phase, Phase.SummaryGeneration);
        return super.wrap(super.push(phase, constraints));

        Constraints newConstraints = new Constraints();
        return super.wrap(super.push(phase, newConstraints));
        // return super.wrap(super.push(phase, constraints));
    }
    protected List<Constraints> resolve(Phase phase, EDG edg, Edge edge, Constraints constraints, LiteralConstraint topConstraint, int productionDepth){
        return super.wrap(constraints);
+14 −4
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import edg.constraint.*;
import edg.graph.Edge;
import edg.graph.LAST;
import edg.graph.Node;
import edg.graph.Variable;

public class ValueEdgeGenerator {
	
@@ -67,6 +68,8 @@ public class ValueEdgeGenerator {

			this.last.addEdge(expression, equality, Edge.Type.Value);
			this.last.addEdge(equality, pattern, Edge.Type.Value);

			this.generateImplicitRestrictions(pattern, List.of(equality));
		}
	}
	private void generateDataConstructorEdges()
@@ -250,9 +253,13 @@ public class ValueEdgeGenerator {
	private void generateImplicitRestrictions(Node patternNode, List<Node> controlExpressionNode){
		if (this.isImplicitRestrictionNode(patternNode)) {
			List<Node> children = this.last.getChildren(patternNode);
			if (children.stream().noneMatch(c -> isImplicitRestrictionNode(c)))
			if (children.stream().noneMatch(this::isImplicitRestrictionNode))
				for (Node node : controlExpressionNode)
					if (patternNode.getType() == Node.Type.Variable)
						this.last.addEdge(patternNode,node, Edge.Type.Value, EmptyConstraint.getConstraint());
					else
						this.last.addEdge(patternNode, node, Edge.Type.Value, LiteralConstraint.getConstraint());
			else
				for (Node child : children)
					this.generateImplicitRestrictions(child, controlExpressionNode);
		}
@@ -264,6 +271,9 @@ public class ValueEdgeGenerator {
			case DataConstructor:
			case List:
				return true;
			case Variable:
				if (((Variable) node).getContext() == Variable.Context.Use)
					return true;
			default:
				return false;
		}
+8 −7
Original line number Diff line number Diff line
@@ -9,30 +9,31 @@ main(Number)
        Number < 7 ->
    Database =
        [[sliced, sliced, sliced,
          {sliced,
          {concerts,
           [{sliced, {2016, 6, 17}},
            {sliced, {2016, 6, 29}},
            {sliced, {2016, 7, 21}},
            {sliced, {2017, 8, 14}}]}],
         [sliced, sliced, sliced,
          {sliced, [{sliced, {2007, 6, 21}}, {sliced, {2008, 10, 28}}]}],
          {concerts,
           [{sliced, {2007, 6, 21}}, {sliced, {2008, 10, 28}}]}],
         [sliced, sliced, sliced,
          {sliced,
          {concerts,
           [{sliced, {2014, 10, 4}},
            {sliced, {2014, 10, 18}},
            {sliced, {2013, 11, 24}}]}],
         [sliced, sliced, sliced,
          {sliced,
          {concerts,
           [{sliced, {2015, 11, 8}},
            {sliced, {2016, 5, 6}},
            {sliced, {2017, 7, 30}}]}],
         [sliced, sliced, sliced,
          {sliced,
          {concerts,
           [{sliced, {2016, 7, 3}},
            {sliced, {2016, 9, 16}},
            {sliced, {2017, 10, 24}}]}],
         [sliced, sliced, sliced,
          {sliced,
          {concerts,
           [{sliced, {2016, 5, 22}},
            {sliced, {2016, 6, 10}},
            {sliced, {2016, 8, 2}},
@@ -43,7 +44,7 @@ main(Number)
    {_, Year} = Info.

getConcerts(Artist) ->
    [_, _, _, {_, Concerts}] = Artist,
    [_, _, _, {concerts, Concerts}] = Artist,
    Concerts.

getNextConcert(Artist) ->