private static bool ConstraintCheck(ShapeNode shapeNode, GoalNode goalNode,
                                            object constraint, out object output)
        {
            output = null;
            var shape1 = shapeNode.ShapeSymbol;
            var goal   = goalNode.Goal as EqGoal;

            Debug.Assert(shape1 != null);
            Debug.Assert(goal != null);

            var label = constraint as string;

            if (label != null)
            {
                var pt1 = shape1 as PointSymbol;
                if (pt1 != null)
                {
                    if (LineAcronym.EqualGeneralFormLabels(label))
                    {
                        var ls = LineBinaryRelation.Unify(pt1, goal);
                        if (ls != null)
                        {
                            ls.OutputType = LineType.GeneralForm;
                            output        = ls;
                            return(true);
                        }
                    }
                }
            }
            //TODO
            return(false);
        }
        public void Test_CreateLine_2()
        {
            var pt1     = new Point(1.0, 2.0);
            var pt2     = new Point(1.0, 2.0);
            var ptSym1  = new PointSymbol(pt1);
            var ptSym2  = new PointSymbol(pt2);
            var lineSym = LineBinaryRelation.Unify(ptSym1, ptSym2);

            Assert.Null(lineSym);
        }
        private static bool ConstraintCheck(GoalNode goalNode1, GoalNode goalNode2,
                                            object constraint, out object output)
        {
            Debug.Assert(constraint != null);
            var st    = constraint as ShapeType?;
            var goal1 = goalNode1.Goal as EqGoal;
            var goal2 = goalNode2.Goal as EqGoal;

            Debug.Assert(goal1 != null);
            Debug.Assert(goal2 != null);
            output = null;
            if (st != null)
            {
                switch (st.Value)
                {
                case ShapeType.Line:
                    output = LineBinaryRelation.Unify(goal1, goal2);
                    break;
                }
                return(output != null);
            }
            var label = constraint as string;

            if (label != null)
            {
                //TODO
                if (LineAcronym.EqualGeneralFormLabels(label))
                {
                    output = LineBinaryRelation.Unify(goal1, goal2);
                    var ls = output as LineSymbol;
                    if (ls != null)
                    {
                        ls.OutputType = LineType.GeneralForm;
                        TraceInstructionalDesign.FromLineSlopeIntercetpToLineGeneralForm(ls);
                        return(true);
                    }
                    return(false);
                }
                if (LineAcronym.EqualSlopeInterceptFormLabels(label))
                {
                    output = LineBinaryRelation.Unify(goal1, goal2);
                    var ls = output as LineSymbol;
                    if (ls != null)
                    {
                        ls.OutputType = LineType.SlopeIntercept;
                        return(true);
                    }
                    return(false);
                }
            }
            return(false);
        }
        public void Test_CreateLine_TwoGoal_1()
        {
            var m     = new Var('m');
            var k     = new Var('k');
            var goal1 = new EqGoal(m, 2.0);
            var goal2 = new EqGoal(k, 1.0);

            var lineSym = LineBinaryRelation.Unify(goal1, goal2);

            Assert.NotNull(lineSym);

            Assert.True(lineSym.SymSlope.Equals("2"));
            Assert.True(lineSym.SymIntercept.Equals("1"));
        }
        public void Test_CreateLine_4()
        {
            var pt1     = new Point(2.0, 1.0);
            var pt2     = new Point(2.0, 2.0);
            var ptSym1  = new PointSymbol(pt1);
            var ptSym2  = new PointSymbol(pt2);
            var lineSym = LineBinaryRelation.Unify(ptSym1, ptSym2) as LineSymbol;

            Assert.NotNull(lineSym);
            var line = lineSym.Shape as Line;

            Assert.NotNull(line);
            Assert.True(line.A.Equals(1.0));
            Assert.True(line.B.Equals(0.0));
            Assert.True(line.C.Equals(-2.0));
        }
        public static void FromPointsToMidPoint(PointSymbol ps1, PointSymbol ps2, PointSymbol midPoint)
        {
            //1. plot the ps1, ps2 and the line
            //2. generate x coordinate
            //3. generate y coordinate
            //4. generate point (x,y)

            string strategy;

            var ts00 = new TraceStep(null, ps1, null, PlottingRule.PlottingStrategy, PlottingRule.Plot(ps1));
            var ts01 = new TraceStep(null, ps2, null, PlottingRule.PlottingStrategy, PlottingRule.Plot(ps2));
            var ls   = LineBinaryRelation.Unify(ps1, ps2) as LineSymbol;
            var ts02 = new TraceStep(null, ls, null, PlottingRule.PlottingStrategy, PlottingRule.Plot(ls));

            strategy = "Plot the given two points and the connected line.";
            midPoint._innerLoop.Add(ts00);
            midPoint._innerLoop.Add(ts01);
            midPoint._innerLoop.Add(ts02);
            midPoint.GenerateATrace(strategy);
            ////////////////////////////////////////////////

            var xCoord = new Var("x");
            var pt1    = ps1.Shape as Point;

            Debug.Assert(pt1 != null);
            var pt2 = ps2.Shape as Point;

            Debug.Assert(pt2 != null);

            var term1 = new Term(Expression.Add, new List <object>()
            {
                pt1.XCoordinate, pt2.XCoordinate
            });
            var term2 = new Term(Expression.Divide, new List <object>()
            {
                term1, 2
            });
            var eq = new Equation(xCoord, term2);

            /////////////////////////////////////////////////

            object obj;
            bool   result = eq.IsEqGoal(out obj);
            EqGoal goal1  = null;

            if (result)
            {
                goal1 = obj as EqGoal;
                Debug.Assert(goal1 != null);
                Debug.Assert(goal1.Traces.Count == 1);
                var currentTrace = goal1.Traces.ToList()[0];
                strategy = "Generate x coordinate of midpoint.";
                var newTrace = new Tuple <object, object>(strategy, currentTrace.Item2);
                midPoint.Traces.Add(newTrace);
            }

            //////////////////////////////////////////////////

            var yCoord = new Var("y");

            term1 = new Term(Expression.Add, new List <object>()
            {
                pt1.YCoordinate, pt2.YCoordinate
            });
            term2 = new Term(Expression.Divide, new List <object>()
            {
                term1, 2
            });
            var eq1 = new Equation(yCoord, term2);

            result = eq1.IsEqGoal(out obj);
            EqGoal goal2 = null;

            if (result)
            {
                goal2 = obj as EqGoal;
                Debug.Assert(goal2 != null);
                Debug.Assert(goal2.Traces.Count == 1);
                var currentTrace1 = goal2.Traces.ToList()[0];
                strategy = "Generate y coordinate of midpoint.";
                var newTrace = new Tuple <object, object>(strategy, currentTrace1.Item2);
                midPoint.Traces.Add(newTrace);
            }

            //////////////////////////////////////////////////////

            var ps   = new Point(xCoord, yCoord);
            var psym = new PointSymbol(ps);

            var mid = midPoint.Shape as Point;

            Debug.Assert(mid != null);
            var ps_inter1   = new Point(mid.XCoordinate, yCoord);
            var psym_inter1 = new PointSymbol(ps_inter1);
            var metaRule    = "Consider substitute generate x coordinate into the point form.";
            var appliedRule = SubstitutionRule.ApplySubstitute(goal1, psym);

            var ts1 = new TraceStep(psym, psym_inter1, null, metaRule, appliedRule);

            metaRule    = "Consider substitute generate y coordinate into the point form.";
            appliedRule = SubstitutionRule.ApplySubstitute(goal2, psym_inter1);
            var ts2 = new TraceStep(psym_inter1, midPoint, null, metaRule, appliedRule);

            strategy = "Generate point (x,y) by subsitute generated x and y.";
            midPoint._innerLoop.Add(ts1);
            midPoint._innerLoop.Add(ts2);
            midPoint.GenerateATrace(strategy);
        }
        private static bool ConstraintCheck(PointSymbol pt1, PointSymbol pt2,
                                            string constraint1, ShapeType constraint2, out object output)
        {
            output = null;
            Debug.Assert(constraint1 != null);

            var label = constraint1 as string;

            char[] charr = label.ToCharArray();
            if (charr.Length != 2)
            {
                return(false);
            }
            string str1   = label.ToCharArray()[0].ToString(CultureInfo.InvariantCulture);
            string str2   = label.ToCharArray()[1].ToString(CultureInfo.InvariantCulture);
            string label1 = pt1.Shape.Label;
            string label2 = pt2.Shape.Label;

            if (label1 == null || label2 == null)
            {
                if (constraint2 == ShapeType.LineSegment)
                {
                    if (constraint1 == LineSegmentAcronym.GeneralForm)
                    {
                        output = LineSegBinaryRelation.Unify(pt1, pt2);
                        if (output != null)
                        {
                            return(true);
                        }
                        output = LineSegmentGenerationRule.IdentityPoints;
                        return(false);
                    }
                    if (constraint1 == LineAcronym.GeneralForm1)
                    {
                        output = LineBinaryRelation.Unify(pt1, pt2);
                        if (output != null)
                        {
                            return(true);
                        }
                        output = LineGenerationRule.IdentityPoints;
                        return(false);
                    }
                }
            }

            bool condition1 = label1.Equals(str1) && label2.Equals(str2);
            bool condition2 = label1.Equals(str2) && label2.Equals(str1);

            if (condition1 || condition2)
            {
                if (constraint2 == ShapeType.Line)
                {
                    output = LineBinaryRelation.Unify(pt1, pt2);
                    if (output != null)
                    {
                        return(true);
                    }
                    output = LineGenerationRule.IdentityPoints;
                    return(false);
                }

                if (constraint2 == ShapeType.LineSegment)
                {
                    output = LineSegBinaryRelation.Unify(pt1, pt2);
                    if (output != null)
                    {
                        return(true);
                    }
                    output = LineSegmentGenerationRule.IdentityPoints;
                    return(false);
                }
            }
            return(false);
        }
        private static bool ConstraintCheck(PointSymbol pt1, PointSymbol pt2,
                                            object constraint, out object output)
        {
            output = null;
            Debug.Assert(constraint != null);
            var shapeType = constraint as ShapeType?;

            if (shapeType != null)
            {
                #region ShapeType Constraint Solving
                if (shapeType == ShapeType.Line)
                {
                    output = LineBinaryRelation.Unify(pt1, pt2);
                    if (output != null)
                    {
                        return(true);
                    }
                    output = LineGenerationRule.IdentityPoints;
                    return(false);
                }

                if (shapeType == ShapeType.LineSegment)
                {
                    output = LineSegBinaryRelation.Unify(pt1, pt2);
                    if (output != null)
                    {
                        return(true);
                    }
                    output = LineSegmentGenerationRule.IdentityPoints;
                    return(false);
                }

                return(false);

                #endregion
            }
            var label = constraint as string;
            if (label != null)
            {
                #region Label Constraint Solving

                if (PointAcronym.MidPoint.Equals(label))
                {
                    //Point
                    output = PointBinaryRelation.Unify(pt1, pt2);
                    var ps = output as PointSymbol;
                    if (ps != null)
                    {
                        return(true);
                    }
                    return(false);
                }

                #region Line Inference

                //Case 2
                if (LineAcronym.EqualGeneralFormLabels(label))
                {
                    output = LineBinaryRelation.Unify(pt1, pt2);
                    var ls = output as LineSymbol;
                    if (ls != null)
                    {
                        ls.OutputType = LineType.GeneralForm;
                        return(true);
                    }
                    return(false);
                }

                if (LineAcronym.EqualSlopeLabels(label))
                {
                    output = LineBinaryRelation.Unify(pt1, pt2);
                    if (output == null)
                    {
                        return(false);
                    }
                    var lss = output as LineSymbol;
                    //TraceInstructionalDesign.FromPointsToLine(lss);
                    var output1 = lss.Unify(label);
                    output = output1;
                    return(true);
                }

                if (LineAcronym.EqualInterceptLabels(label))
                {
                    output = LineBinaryRelation.Unify(pt1, pt2);
                    if (output == null)
                    {
                        return(false);
                    }
                    var lss = output as LineSymbol;
                    //TraceInstructionalDesign.FromPointsToLine(lss);
                    var output1 = lss.Unify(label);
                    output = output1;
                    return(true);
                }

                if (LineAcronym.EqualSlopeInterceptFormLabels(label))
                {
                    output = LineBinaryRelation.Unify(pt1, pt2);
                    var ls = output as LineSymbol;
                    if (ls != null)
                    {
                        ls.OutputType = LineType.SlopeIntercept;
                        return(true);
                    }
                    return(false);
                }

                #endregion

                #region Line Segment Inference

                if (LineSegmentAcronym.EqualDistanceLabel(label))
                {
                    output = LineSegBinaryRelation.Unify(pt1, pt2);
                    if (output == null)
                    {
                        return(false);
                    }
                    var lss     = output as LineSegmentSymbol;
                    var output1 = lss.Unify(label);
                    output = output1;
                    #region Embed Line Segment(obsolete)

                    /*
                     * Debug.Assert(lss != null);
                     * if (lss.CachedSymbols.Count == 0)
                     * {
                     *  output = output1;
                     *  var lst = new List<object>()
                     *  {
                     *      output, output1
                     *  };
                     *
                     *  output = lst;
                     * }
                     * else
                     * {
                     *  var goalLst = output1 as List<EqGoal>;
                     *  Debug.Assert(goalLst != null);
                     *  var lst = new List<object>();
                     *  for (int i = 0; i < lss.CachedSymbols.Count; i++)
                     *  {
                     *      var cachedSS = lss.CachedSymbols.ToList()[i];
                     *      lst.Add(cachedSS);
                     *      lst.Add(goalLst[i]);
                     *  }
                     *  output = lst;
                     * }*/

                    #endregion
                    return(true);
                }

                #endregion

                #region ambiguious inference

                //Case 1
                char[] charr = label.ToCharArray();
                if (charr.Length != 2)
                {
                    return(false);
                }
                string str1   = label.ToCharArray()[0].ToString(CultureInfo.InvariantCulture);
                string str2   = label.ToCharArray()[1].ToString(CultureInfo.InvariantCulture);
                string label1 = pt1.Shape.Label;
                string label2 = pt2.Shape.Label;
                if (label1 == null || label2 == null)
                {
                    return(false);
                }
                bool condition1 = label1.Equals(str1) && label2.Equals(str2);
                bool condition2 = label1.Equals(str2) && label2.Equals(str1);
                if (condition1 || condition2)
                {
                    var supportTypes = new List <ShapeType> {
                        ShapeType.Line, ShapeType.LineSegment
                    };
                    output = supportTypes;
                    return(false);
                }

                #endregion

                #endregion
            }

            var eqGoal = constraint as EqGoal;
            if (eqGoal != null)
            {
                var goalLabel = eqGoal.Lhs.ToString();

                #region Line Segment Inference

                if (LineSegmentAcronym.EqualDistanceLabel(goalLabel))
                {
                    output = LineSegBinaryRelation.Unify(pt1, pt2);
                    if (output == null)
                    {
                        return(false);
                    }
                    var lss = output as LineSegmentSymbol;
                    //TraceInstructionalDesign.FromPointsToLineSegment(lss);
                    output = lss.Unify(eqGoal);
                    if (output == null)
                    {
                        return(false);
                    }
                    return(true);
                }

                if (LineAcronym.EqualSlopeLabels(goalLabel))
                {
                    output = LineBinaryRelation.Unify(pt1, pt2, eqGoal);
                    if (output == null)
                    {
                        return(false);
                    }
                    return(true);
                }

                #endregion
            }

            return(false);
        }