Example #1
0
        ////
        //// Constructs the coverage relationship amongst all figure components
        ////
        //private static void HandleAllFigureIntrinsicFacts(List<GroundedClause> figure)
        //{
        //    for (int f1 = 0; f1 < figure.Count; f1++)
        //    {
        //        for (int f2 = 0; f2 < figure.Count; f2++)
        //        {
        //            if (f1 != f2)
        //            {
        //                if (figure[f1].Covers(figure[f2])) figure[f1].AddComponent(figure[f2].clauseId);
        //            }
        //        }
        //    }
        //}

        //
        // Preprocess the given clauses
        //
        private static void HandleAllGivens(List <GroundedClause> figure, List <GroundedClause> givens)
        {
            ////
            //// Link the boolean facts to the intrinsic facts through coverage (implication)
            ////
            //foreach (GroundedClause given in givens)
            //{
            //    foreach (GroundedClause component in figure)
            //    {
            //        if (given.Covers(component))
            //        {
            //            given.AddComponent(component.clauseId);
            //            given.AddComponentList(component.figureComponents);
            //        }
            //    }
            //}

            //
            // Are any of the givens congruent relationships?
            //
            foreach (GroundedClause clause in givens)
            {
                if (clause is CongruentTriangles)
                {
                    CongruentTriangles conTris = clause as CongruentTriangles;
                    if (conTris.VerifyCongruentTriangles())
                    {
                        // indicate that these triangles are congruent to prevent future 'reproving' congruent
                        conTris.ProcessGivens();
                    }
                    // This is not a valid congruence.
                    else
                    {
                        // Remove?
                    }
                }
                //else if (clause is SimilarTriangles)
                //{
                //    SimilarTriangles simTris = clause as SimilarTriangles;
                //    if (simTris.VerifyCongruentTriangles())
                //    {
                //        // indicate that these triangles are congruent to prevent future 'reproving' congruent
                //        simTris.ProcessGivens();
                //    }
                //    // This is not a valid similarity.
                //    else
                //    {
                //        // Remove?
                //    }
                //}
            }
        }
Example #2
0
        //
        // Acquires all of the applicable congruent segments; then checks HL
        //
        private static List <EdgeAggregator> CollectAndCheckHL(RightTriangle rt1, RightTriangle rt2,
                                                               CongruentSegments css1, CongruentSegments css2,
                                                               GroundedClause original1, GroundedClause original2)
        {
            List <EdgeAggregator> newGrounded = new List <EdgeAggregator>();

            // The Congruence pairs must relate the two triangles
            if (!css1.LinksTriangles(rt1, rt2) || !css2.LinksTriangles(rt1, rt2))
            {
                return(newGrounded);
            }

            // One of the congruence pairs must relate the hypotenuses
            Segment hypotenuse1 = rt1.OtherSide(rt1.rightAngle);
            Segment hypotenuse2 = rt2.OtherSide(rt2.rightAngle);

            // Determine the specific congruence pair that relates the hypotenuses
            CongruentSegments hypotenuseCongruence    = null;
            CongruentSegments nonHypotenuseCongruence = null;

            if (css1.HasSegment(hypotenuse1) && css1.HasSegment(hypotenuse2))
            {
                hypotenuseCongruence    = css1;
                nonHypotenuseCongruence = css2;
            }
            else if (css2.HasSegment(hypotenuse1) && css2.HasSegment(hypotenuse2))
            {
                hypotenuseCongruence    = css2;
                nonHypotenuseCongruence = css1;
            }
            else
            {
                return(newGrounded);
            }

            // Sanity check that the non hypotenuse congruence pair does not contain hypotenuse
            if (nonHypotenuseCongruence.HasSegment(hypotenuse1) || nonHypotenuseCongruence.HasSegment(hypotenuse2))
            {
                return(newGrounded);
            }

            //
            // We now have a hypotenuse leg situation; acquire the point-to-point congruence mapping
            //
            List <Point> triangleOne = new List <Point>();
            List <Point> triangleTwo = new List <Point>();

            // Right angle vertices correspond
            triangleOne.Add(rt1.rightAngle.GetVertex());
            triangleTwo.Add(rt2.rightAngle.GetVertex());

            Point nonRightVertexRt1 = rt1.GetSegment(nonHypotenuseCongruence).SharedVertex(hypotenuse1);
            Point nonRightVertexRt2 = rt2.GetSegment(nonHypotenuseCongruence).SharedVertex(hypotenuse2);

            triangleOne.Add(nonRightVertexRt1);
            triangleTwo.Add(nonRightVertexRt2);

            triangleOne.Add(hypotenuse1.OtherPoint(nonRightVertexRt1));
            triangleTwo.Add(hypotenuse2.OtherPoint(nonRightVertexRt2));

            //
            // Construct the new deduced relationships
            //
            GeometricCongruentTriangles ccts = new GeometricCongruentTriangles(new Triangle(triangleOne),
                                                                               new Triangle(triangleTwo));

            // Hypergraph
            List <GroundedClause> antecedent = new List <GroundedClause>();

            antecedent.Add(original1);
            antecedent.Add(original2);
            antecedent.Add(css1);
            antecedent.Add(css2);

            newGrounded.Add(new EdgeAggregator(antecedent, ccts, annotation));

            // Add all the corresponding parts as new congruent clauses
            newGrounded.AddRange(CongruentTriangles.GenerateCPCTC(ccts, triangleOne, triangleTwo));

            return(newGrounded);
        }
Example #3
0
        //
        // Main instantiation function for all figures stated in the given list; worklist technique to construct the graph
        //
        public Hypergraph <GroundedClause, Hypergraph.EdgeAnnotation> Instantiate(List <ConcreteAST.GroundedClause> figure, List <ConcreteAST.GroundedClause> givens)
        {
            // The worklist initialized to initial set of ground clauses from the figure
            List <GroundedClause> worklist = new List <GroundedClause>(figure);

            worklist.AddRange(givens);

            // Add all initial elements to the graph
            figure.ForEach(g => { graph.AddNode(g); g.SetID(graph.Size()); });
            givens.ForEach(g => { graph.AddNode(g); g.SetID(graph.Size()); });

            // Indicate all figure-based information is intrinsic; this needs to verified with the UI
            figure.ForEach(f => f.MakeIntrinsic());

            // For problem generation, indicate that all given information is intrinsic
            givens.ForEach(g => g.MakeGiven());

            // Calculates Coverage of the figure
            //HandleAllFigureIntrinsicFacts(figure);

            HandleAllGivens(figure, givens);

            //
            // Process all new clauses until the worklist is empty
            //
            int numSequentialEquations = 0;

            while (worklist.Any())
            {
                // Acquire the first element from the list for processing
                GroundedClause clause = worklist[0];
                worklist.RemoveAt(0);

                if (Utilities.DEBUG)
                {
                    Debug.WriteLine("Working on: " + clause.clauseId + " " + clause.ToString());
                }

                //
                // Cutoff counter; seek a bunch of equations in sequence.
                //
                int NUMEQUATIONS_FOR_CUTOFF = 50;

                if (clause is Equation || clause.IsAlgebraic() || clause is Supplementary)
                {
                    numSequentialEquations++;
                }
                else
                {
                    numSequentialEquations = 0;
                }

                if (numSequentialEquations >= NUMEQUATIONS_FOR_CUTOFF)
                {
                    return(graph);
                }

                if (graph.Size() > 800)
                {
                    return(graph);
                }

                //
                // Apply the clause to all applicable instantiators
                //
                if (clause is Point)
                {
                    Point.Record(clause);
                }
                else if (clause is Angle)
                {
                    // A list of all problem angles
                    Angle.Record(clause);

                    if (clause is RightAngle)
                    {
                        HandleDeducedClauses(worklist, RightAngleDefinition.Instantiate(clause));
                        HandleDeducedClauses(worklist, PerpendicularDefinition.Instantiate(clause));
                        HandleDeducedClauses(worklist, ComplementaryDefinition.Instantiate(clause));
                        HandleDeducedClauses(worklist, RightTriangleDefinition.Instantiate(clause));
                    }
                    HandleDeducedClauses(worklist, ExteriorAngleEqualSumRemoteAngles.Instantiate(clause));
                    // HandleDeducedClauses(worklist, AngleAdditionAxiom.Instantiate(clause));

                    //HandleDeducedClauses(worklist, ConcreteAngle.Instantiate(null, clause));
                    //HandleDeducedClauses(worklist, AngleBisector.Instantiate(clause));

                    HandleDeducedClauses(worklist, PerpendicularImplyCongruentAdjacentAngles.Instantiate(clause));
                    HandleDeducedClauses(worklist, AdjacentAnglesPerpendicularImplyComplementary.Instantiate(clause));

                    // Circle
                    HandleDeducedClauses(worklist, AngleInscribedSemiCircleIsRight.Instantiate(clause));
                    HandleDeducedClauses(worklist, InscribedAngleHalfInterceptedArc.Instantiate(clause));
                    HandleDeducedClauses(worklist, CentralAngleEqualInterceptedArc.Instantiate(clause));
                    HandleDeducedClauses(worklist, ChordTangentAngleHalfInterceptedArc.Instantiate(clause));
                    HandleDeducedClauses(worklist, TwoInterceptedArcsHaveCongruentAngles.Instantiate(clause));
                }
                else if (clause is Arc)
                {
                    Arc.Record(clause);

                    if (clause is Semicircle)
                    {
                        HandleDeducedClauses(worklist, AngleInscribedSemiCircleIsRight.Instantiate(clause));
                    }
                }
                else if (clause is Segment)
                {
                    HandleDeducedClauses(worklist, Segment.Instantiate(clause));
                    HandleDeducedClauses(worklist, AngleBisectorDefinition.Instantiate(clause));
                    Segment.Record(clause);
                }
                else if (clause is InMiddle)
                {
                    HandleDeducedClauses(worklist, SegmentAdditionAxiom.Instantiate(clause));
                    HandleDeducedClauses(worklist, MidpointDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, MedianDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, SegmentBisectorDefinition.Instantiate(clause));
                }
                else if (clause is ArcInMiddle)
                {
                    // HandleDeducedClauses(worklist, ArcAdditionAxiom.Instantiate(clause));
                }
                else if (clause is Intersection)
                {
                    HandleDeducedClauses(worklist, AltitudeDefinition.Instantiate(clause));

                    if (clause is PerpendicularBisector)
                    {
                        HandleDeducedClauses(worklist, PerpendicularBisectorDefinition.Instantiate(clause));
                    }
                    else if (clause is Perpendicular)
                    {
                        HandleDeducedClauses(worklist, PerpendicularImplyCongruentAdjacentAngles.Instantiate(clause));
                        HandleDeducedClauses(worklist, AdjacentAnglesPerpendicularImplyComplementary.Instantiate(clause));
                        HandleDeducedClauses(worklist, TransversalPerpendicularToParallelImplyBothPerpendicular.Instantiate(clause));
                        HandleDeducedClauses(worklist, PerpendicularDefinition.Instantiate(clause));
                        HandleDeducedClauses(worklist, PerpendicularToRadiusIsTangent.Instantiate(clause));
                    }
                    else
                    {
                        HandleDeducedClauses(worklist, VerticalAnglesTheorem.Instantiate(clause));
                        HandleDeducedClauses(worklist, AltIntCongruentAnglesImplyParallel.Instantiate(clause));
                        HandleDeducedClauses(worklist, SameSideSuppleAnglesImplyParallel.Instantiate(clause));
                        HandleDeducedClauses(worklist, TriangleProportionality.Instantiate(clause));
                        HandleDeducedClauses(worklist, SegmentBisectorDefinition.Instantiate(clause));
                        HandleDeducedClauses(worklist, CorrespondingAnglesOfParallelLines.Instantiate(clause));
                        HandleDeducedClauses(worklist, CongruentCorrespondingAnglesImplyParallel.Instantiate(clause));
                        HandleDeducedClauses(worklist, CongruentAdjacentAnglesImplyPerpendicular.Instantiate(clause));
                        HandleDeducedClauses(worklist, AngleBisectorIsPerpendicularBisectorInIsosceles.Instantiate(clause));
                        HandleDeducedClauses(worklist, TransversalPerpendicularToParallelImplyBothPerpendicular.Instantiate(clause));
                        HandleDeducedClauses(worklist, ParallelImplyAltIntCongruentAngles.Instantiate(clause));
                        HandleDeducedClauses(worklist, ParallelImplySameSideInteriorSupplementary.Instantiate(clause));
                        HandleDeducedClauses(worklist, PerpendicularDefinition.Instantiate(clause));
                        HandleDeducedClauses(worklist, MedianDefinition.Instantiate(clause));
                        HandleDeducedClauses(worklist, SupplementaryDefinition.Instantiate(clause));

                        // Quad Theorems
                        HandleDeducedClauses(worklist, DiagonalsParallelogramBisectEachOther.Instantiate(clause));

                        // Circles
                        HandleDeducedClauses(worklist, ChordTangentAngleHalfInterceptedArc.Instantiate(clause));
                        HandleDeducedClauses(worklist, DiameterPerpendicularToChordBisectsChordAndArc.Instantiate(clause));
                        HandleDeducedClauses(worklist, ExteriorAngleHalfDifferenceInterceptedArcs.Instantiate(clause));
                        HandleDeducedClauses(worklist, TangentPerpendicularToRadius.Instantiate(clause));
                        HandleDeducedClauses(worklist, TangentsToCircleFromPointAreCongruent.Instantiate(clause));
                        HandleDeducedClauses(worklist, TwoChordsAnglesHalfSumInterceptedArc.Instantiate(clause));
                    }
                }
                else if (clause is Complementary)
                {
                    HandleDeducedClauses(worklist, RelationsOfCongruentAnglesAreCongruent.Instantiate(clause));
                    HandleDeducedClauses(worklist, ComplementaryDefinition.Instantiate(clause));
                }
                else if (clause is Altitude)
                {
                    HandleDeducedClauses(worklist, AltitudeDefinition.Instantiate(clause));
                }
                else if (clause is AngleBisector)
                {
                    HandleDeducedClauses(worklist, AngleBisectorDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, AngleBisectorTheorem.Instantiate(clause));
                    HandleDeducedClauses(worklist, AngleBisectorIsPerpendicularBisectorInIsosceles.Instantiate(clause));
                }
                else if (clause is Supplementary)
                {
                    HandleDeducedClauses(worklist, SameSideSuppleAnglesImplyParallel.Instantiate(clause));
                    HandleDeducedClauses(worklist, RelationsOfCongruentAnglesAreCongruent.Instantiate(clause));
                    HandleDeducedClauses(worklist, SupplementaryAndCongruentImplyRightAngles.Instantiate(clause));
                }
                else if (clause is SegmentRatio)
                {
                    HandleDeducedClauses(worklist, TransitiveSubstitution.Instantiate(clause)); // Simplifies as well
                }
                else if (clause is Equation)
                {
                    HandleDeducedClauses(worklist, TransitiveSubstitution.Instantiate(clause)); // Simplifies as well
                    HandleDeducedClauses(worklist, SegmentRatio.InstantiateEquation(clause));
                    if (clause is AngleEquation)
                    {
                        HandleDeducedClauses(worklist, AnglesOfEqualMeasureAreCongruent.Instantiate(clause));
                        HandleDeducedClauses(worklist, ComplementaryDefinition.Instantiate(clause));
                        HandleDeducedClauses(worklist, RightAngleDefinition.Instantiate(clause));
                    }
                    // If a geometric equation was constructed, it may not have been checked for proportionality
                    if ((clause as Equation).IsGeometric())
                    {
                        HandleDeducedClauses(worklist, ProportionalAngles.Instantiate(clause));
                        HandleDeducedClauses(worklist, SegmentRatio.InstantiateEquation(clause));
                    }
                }
                else if (clause is Midpoint)
                {
                    HandleDeducedClauses(worklist, MidpointDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, MidpointTheorem.Instantiate(clause));
                }
                else if (clause is Collinear)
                {
                    HandleDeducedClauses(worklist, StraightAngleDefinition.Instantiate(clause));
                }
                else if (clause is Median)
                {
                    HandleDeducedClauses(worklist, MedianDefinition.Instantiate(clause));
                }
                else if (clause is SegmentBisector)
                {
                    HandleDeducedClauses(worklist, SegmentBisectorDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, MedianDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, DiagonalsBisectEachOtherImplyParallelogram.Instantiate(clause));
                }
                else if (clause is Parallel)
                {
                    HandleDeducedClauses(worklist, TriangleProportionality.Instantiate(clause));
                    HandleDeducedClauses(worklist, CorrespondingAnglesOfParallelLines.Instantiate(clause));
                    HandleDeducedClauses(worklist, TransversalPerpendicularToParallelImplyBothPerpendicular.Instantiate(clause));
                    HandleDeducedClauses(worklist, ParallelImplyAltIntCongruentAngles.Instantiate(clause));
                    HandleDeducedClauses(worklist, ParallelImplySameSideInteriorSupplementary.Instantiate(clause));

                    // Quadrilaterals
                    HandleDeducedClauses(worklist, ParallelogramDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, TrapezoidDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, OnePairOppSidesCongruentParallelImpliesParallelogram.Instantiate(clause));
                }
                else if (clause is SegmentRatioEquation)
                {
                    HandleDeducedClauses(worklist, SASSimilarity.Instantiate(clause));
                    HandleDeducedClauses(worklist, SSSSimilarity.Instantiate(clause));
                    //                    HandleDeducedClauses(worklist, SegmentRatio.InstantiateProportion(clause));
                    HandleDeducedClauses(worklist, TransitiveSubstitution.Instantiate(clause)); // Simplifies as well
                }
                else if (clause is ProportionalAngles)
                {
                    HandleDeducedClauses(worklist, ProportionalAngles.InstantiateProportion(clause));
                }
                else if (clause is CongruentTriangles)
                {
                    HandleDeducedClauses(worklist, CongruentTriangles.Instantiate(clause));
                    HandleDeducedClauses(worklist, TransitiveCongruentTriangles.Instantiate(clause));
                }
                else if (clause is CongruentAngles)
                {
                    HandleDeducedClauses(worklist, SupplementaryAndCongruentImplyRightAngles.Instantiate(clause));
                    HandleDeducedClauses(worklist, TwoPairsCongruentAnglesImplyThirdPairCongruent.Instantiate(clause));
                    HandleDeducedClauses(worklist, SASCongruence.Instantiate(clause));
                    HandleDeducedClauses(worklist, ASA.Instantiate(clause));
                    HandleDeducedClauses(worklist, AAS.Instantiate(clause));
                    HandleDeducedClauses(worklist, AngleAdditionAxiom.Instantiate(clause));
                    HandleDeducedClauses(worklist, CongruentAnglesInTriangleImplyCongruentSides.Instantiate(clause));
                    HandleDeducedClauses(worklist, SASSimilarity.Instantiate(clause));
                    HandleDeducedClauses(worklist, AASimilarity.Instantiate(clause));
                    HandleDeducedClauses(worklist, AltIntCongruentAnglesImplyParallel.Instantiate(clause));
                    HandleDeducedClauses(worklist, TransitiveSubstitution.Instantiate(clause)); // Simplifies as well
                    HandleDeducedClauses(worklist, CongruentCorrespondingAnglesImplyParallel.Instantiate(clause));
                    HandleDeducedClauses(worklist, CongruentAdjacentAnglesImplyPerpendicular.Instantiate(clause));
                    HandleDeducedClauses(worklist, RelationsOfCongruentAnglesAreCongruent.Instantiate(clause));
                    HandleDeducedClauses(worklist, AngleBisectorDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, RightAngleDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, SupplementaryDefinition.Instantiate(clause));

                    // Quadrilaterals
                    HandleDeducedClauses(worklist, BothPairsOppAnglesCongruentImpliesParallelogram.Instantiate(clause));

                    // Circles
                    HandleDeducedClauses(worklist, MinorArcsCongruentIfCentralAnglesCongruent.Instantiate(clause));
                }
                else if (clause is CongruentSegments)
                {
                    HandleDeducedClauses(worklist, SegmentBisectorDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, SSS.Instantiate(clause));
                    HandleDeducedClauses(worklist, SASCongruence.Instantiate(clause));
                    HandleDeducedClauses(worklist, ASA.Instantiate(clause));
                    HandleDeducedClauses(worklist, AAS.Instantiate(clause));
                    HandleDeducedClauses(worklist, HypotenuseLeg.Instantiate(clause));
                    HandleDeducedClauses(worklist, EquilateralTriangleDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, IsoscelesTriangleDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, MidpointDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, TransitiveSubstitution.Instantiate(clause)); // Simplifies as well
                    HandleDeducedClauses(worklist, CongruentSidesInTriangleImplyCongruentAngles.Instantiate(clause));
                    HandleDeducedClauses(worklist, CongruentSegmentsImplySegmentRatioDefinition.Instantiate(clause));

                    // For quadrilaterals
                    HandleDeducedClauses(worklist, IsoscelesTrapezoidDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, KiteDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, RhombusDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, BothPairsOppSidesCongruentImpliesParallelogram.Instantiate(clause));
                    HandleDeducedClauses(worklist, OnePairOppSidesCongruentParallelImpliesParallelogram.Instantiate(clause));

                    // Circles
                    HandleDeducedClauses(worklist, CongruentCircleDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, CongruentArcsHaveCongruentChords.Instantiate(clause));
                }
                else if (clause is Triangle)
                {
                    Triangle.Record(clause);

                    //HandleDeducedClauses(worklist, SumAnglesInTriangle.Instantiate(clause));
                    HandleDeducedClauses(worklist, Angle.InstantiateReflexiveAngles(clause));
                    HandleDeducedClauses(worklist, Triangle.Instantiate(clause));
                    HandleDeducedClauses(worklist, SSS.Instantiate(clause));
                    HandleDeducedClauses(worklist, SASCongruence.Instantiate(clause));
                    HandleDeducedClauses(worklist, ASA.Instantiate(clause));
                    HandleDeducedClauses(worklist, AAS.Instantiate(clause));
                    HandleDeducedClauses(worklist, HypotenuseLeg.Instantiate(clause));
                    HandleDeducedClauses(worklist, EquilateralTriangleDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, IsoscelesTriangleDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, ExteriorAngleEqualSumRemoteAngles.Instantiate(clause));
                    HandleDeducedClauses(worklist, CongruentAnglesInTriangleImplyCongruentSides.Instantiate(clause));
                    HandleDeducedClauses(worklist, CongruentSidesInTriangleImplyCongruentAngles.Instantiate(clause));
                    HandleDeducedClauses(worklist, SASSimilarity.Instantiate(clause));
                    HandleDeducedClauses(worklist, SSSSimilarity.Instantiate(clause));
                    HandleDeducedClauses(worklist, AASimilarity.Instantiate(clause));
                    HandleDeducedClauses(worklist, TriangleProportionality.Instantiate(clause));
                    HandleDeducedClauses(worklist, AcuteAnglesInRightTriangleComplementary.Instantiate(clause));
                    HandleDeducedClauses(worklist, TwoPairsCongruentAnglesImplyThirdPairCongruent.Instantiate(clause));
                    HandleDeducedClauses(worklist, AltitudeDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, RightTriangleDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, MedianDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, CongruentSegmentsImplySegmentRatioDefinition.Instantiate(clause));

                    if (clause is IsoscelesTriangle)
                    {
                        HandleDeducedClauses(worklist, IsoscelesTriangleTheorem.Instantiate(clause));

                        // CTA: Needs to worl with Equilateral Triangles as well
                        HandleDeducedClauses(worklist, AngleBisectorIsPerpendicularBisectorInIsosceles.Instantiate(clause));
                    }

                    if (clause is EquilateralTriangle)
                    {
                        HandleDeducedClauses(worklist, EquilateralTriangleHasSixtyDegreeAngles.Instantiate(clause));
                    }
                }
                else if (clause is Quadrilateral)
                {
                    Quadrilateral.Record(clause);

                    if (clause is Quadrilateral)
                    {
                        if ((clause as Quadrilateral).IsStrictQuadrilateral())
                        {
                            HandleDeducedClauses(worklist, ParallelogramDefinition.Instantiate(clause));
                            HandleDeducedClauses(worklist, RhombusDefinition.Instantiate(clause));
                            HandleDeducedClauses(worklist, SquareDefinition.Instantiate(clause));
                            HandleDeducedClauses(worklist, KiteDefinition.Instantiate(clause));
                            HandleDeducedClauses(worklist, TrapezoidDefinition.Instantiate(clause));

                            HandleDeducedClauses(worklist, BothPairsOppSidesCongruentImpliesParallelogram.Instantiate(clause));
                            HandleDeducedClauses(worklist, OnePairOppSidesCongruentParallelImpliesParallelogram.Instantiate(clause));
                            HandleDeducedClauses(worklist, BothPairsOppAnglesCongruentImpliesParallelogram.Instantiate(clause));
                            HandleDeducedClauses(worklist, DiagonalsBisectEachOtherImplyParallelogram.Instantiate(clause));
                        }
                    }

                    if (clause is Parallelogram)
                    {
                        HandleDeducedClauses(worklist, ParallelogramDefinition.Instantiate(clause));
                        HandleDeducedClauses(worklist, RectangleDefinition.Instantiate(clause));

                        // Quad Theorems
                        HandleDeducedClauses(worklist, OppositeSidesOfParallelogramAreCongruent.Instantiate(clause));
                        HandleDeducedClauses(worklist, OppositeAnglesOfParallelogramAreCongruent.Instantiate(clause));
                        HandleDeducedClauses(worklist, DiagonalsParallelogramBisectEachOther.Instantiate(clause));
                    }

                    if (clause is Trapezoid)
                    {
                        HandleDeducedClauses(worklist, TrapezoidDefinition.Instantiate(clause));
                        HandleDeducedClauses(worklist, IsoscelesTrapezoidDefinition.Instantiate(clause));
                        HandleDeducedClauses(worklist, MedianTrapezoidParallelToBases.Instantiate(clause));
                        HandleDeducedClauses(worklist, MedianTrapezoidHalfSumBases.Instantiate(clause));
                    }

                    if (clause is IsoscelesTrapezoid)
                    {
                        HandleDeducedClauses(worklist, TrapezoidDefinition.Instantiate(clause));
                        HandleDeducedClauses(worklist, IsoscelesTrapezoidDefinition.Instantiate(clause));
                        HandleDeducedClauses(worklist, BaseAnglesIsoscelesTrapezoidCongruent.Instantiate(clause));
                    }

                    if (clause is Rhombus)
                    {
                        HandleDeducedClauses(worklist, RhombusDefinition.Instantiate(clause));
                        HandleDeducedClauses(worklist, SquareDefinition.Instantiate(clause));
                        HandleDeducedClauses(worklist, DiagonalsOfRhombusArePerpendicular.Instantiate(clause));
                        HandleDeducedClauses(worklist, DiagonalsOfRhombusBisectRhombusAngles.Instantiate(clause));
                    }

                    if (clause is Square)
                    {
                        HandleDeducedClauses(worklist, SquareDefinition.Instantiate(clause));
                    }

                    if (clause is Rectangle)
                    {
                        HandleDeducedClauses(worklist, RectangleDefinition.Instantiate(clause));
                        HandleDeducedClauses(worklist, DiagonalsOfRectangleAreCongruent.Instantiate(clause));
                    }

                    if (clause is Kite)
                    {
                        HandleDeducedClauses(worklist, KiteDefinition.Instantiate(clause));
                        HandleDeducedClauses(worklist, DiagonalsOfKiteArePerpendicular.Instantiate(clause));
                    }
                }
                else if (clause is Strengthened)
                {
                    HandleDeducedClauses(worklist, IsoscelesTriangleTheorem.Instantiate(clause));
                    HandleDeducedClauses(worklist, IsoscelesTriangleDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, EquilateralTriangleDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, AcuteAnglesInRightTriangleComplementary.Instantiate(clause));
                    HandleDeducedClauses(worklist, AngleBisectorIsPerpendicularBisectorInIsosceles.Instantiate(clause));
                    HandleDeducedClauses(worklist, EquilateralTriangleHasSixtyDegreeAngles.Instantiate(clause));
                    HandleDeducedClauses(worklist, SASCongruence.Instantiate(clause));
                    HandleDeducedClauses(worklist, HypotenuseLeg.Instantiate(clause));

                    // For strengthening an intersection to a perpendicular
                    HandleDeducedClauses(worklist, PerpendicularImplyCongruentAdjacentAngles.Instantiate(clause));
                    HandleDeducedClauses(worklist, AdjacentAnglesPerpendicularImplyComplementary.Instantiate(clause));
                    HandleDeducedClauses(worklist, AltitudeDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, TransversalPerpendicularToParallelImplyBothPerpendicular.Instantiate(clause));
                    HandleDeducedClauses(worklist, RightTriangleDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, PerpendicularDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, PerpendicularBisectorDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, SegmentBisectorDefinition.Instantiate(clause));

                    // InMiddle Strengthened to Midpoint
                    HandleDeducedClauses(worklist, MidpointDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, MidpointTheorem.Instantiate(clause));
                    HandleDeducedClauses(worklist, MedianDefinition.Instantiate(clause));

                    // Right Angle
                    HandleDeducedClauses(worklist, RightAngleDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, ComplementaryDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, RightTriangleDefinition.Instantiate(clause));

                    // Correlating isoceles triangles with right triangles.
                    CoordinateRightIsoscelesTriangles.Instantiate(clause);

                    // For quadrilateral definitions
                    HandleDeducedClauses(worklist, TrapezoidDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, IsoscelesTrapezoidDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, SquareDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, KiteDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, ParallelogramDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, RectangleDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, RhombusDefinition.Instantiate(clause));

                    // Quad Theorems
                    HandleDeducedClauses(worklist, OppositeSidesOfParallelogramAreCongruent.Instantiate(clause));
                    HandleDeducedClauses(worklist, OppositeAnglesOfParallelogramAreCongruent.Instantiate(clause));
                    HandleDeducedClauses(worklist, DiagonalsParallelogramBisectEachOther.Instantiate(clause));
                    HandleDeducedClauses(worklist, DiagonalsBisectEachOtherImplyParallelogram.Instantiate(clause));
                    HandleDeducedClauses(worklist, DiagonalsOfRectangleAreCongruent.Instantiate(clause));
                    HandleDeducedClauses(worklist, DiagonalsOfKiteArePerpendicular.Instantiate(clause));
                    HandleDeducedClauses(worklist, DiagonalsOfRhombusArePerpendicular.Instantiate(clause));
                    HandleDeducedClauses(worklist, DiagonalsOfRhombusBisectRhombusAngles.Instantiate(clause));
                    HandleDeducedClauses(worklist, BaseAnglesIsoscelesTrapezoidCongruent.Instantiate(clause));
                    HandleDeducedClauses(worklist, MedianTrapezoidParallelToBases.Instantiate(clause));
                    HandleDeducedClauses(worklist, MedianTrapezoidHalfSumBases.Instantiate(clause));

                    // Circle
                    HandleDeducedClauses(worklist, AngleInscribedSemiCircleIsRight.Instantiate(clause));
                    HandleDeducedClauses(worklist, ChordTangentAngleHalfInterceptedArc.Instantiate(clause));
                    HandleDeducedClauses(worklist, DiameterPerpendicularToChordBisectsChordAndArc.Instantiate(clause));
                    HandleDeducedClauses(worklist, ExteriorAngleHalfDifferenceInterceptedArcs.Instantiate(clause));
                    HandleDeducedClauses(worklist, PerpendicularToRadiusIsTangent.Instantiate(clause));
                    HandleDeducedClauses(worklist, TangentPerpendicularToRadius.Instantiate(clause));
                    HandleDeducedClauses(worklist, TangentsToCircleFromPointAreCongruent.Instantiate(clause));
                }
                else if (clause is CircleIntersection)
                {
                    HandleDeducedClauses(worklist, DiameterPerpendicularToChordBisectsChordAndArc.Instantiate(clause));
                    HandleDeducedClauses(worklist, PerpendicularToRadiusIsTangent.Instantiate(clause));
                }
                else if (clause is Tangent)
                {
                    // HandleDeducedClauses(worklist, ChordTangentAngleHalfInterceptedArc.Instantiate(clause));
                    // HandleDeducedClauses(worklist, ExteriorAngleHalfDifferenceInterceptedArcs.Instantiate(clause));
                    HandleDeducedClauses(worklist, TangentPerpendicularToRadius.Instantiate(clause));
                    HandleDeducedClauses(worklist, TangentsToCircleFromPointAreCongruent.Instantiate(clause));
                }
                else if (clause is CongruentArcs)
                {
                    HandleDeducedClauses(worklist, TransitiveSubstitution.Instantiate(clause)); // Simplifies as well
                    HandleDeducedClauses(worklist, CongruentArcsHaveCongruentChords.Instantiate(clause));
                    HandleDeducedClauses(worklist, MinorArcsCongruentIfCentralAnglesCongruent.Instantiate(clause));
                }
                else if (clause is Circle)
                {
                    Circle.Record(clause);

                    HandleDeducedClauses(worklist, CircleDefinition.Instantiate(clause));
                    HandleDeducedClauses(worklist, CentralAngleEqualInterceptedArc.Instantiate(clause));
                    //HandleDeducedClauses(worklist, ExteriorAngleHalfDifferenceInterceptedArcs.Instantiate(clause));
                    HandleDeducedClauses(worklist, InscribedAngleHalfInterceptedArc.Instantiate(clause));
                    //HandleDeducedClauses(worklist, TwoChordsAnglesHalfSumInterceptedArc.Instantiate(clause));
                    HandleDeducedClauses(worklist, InscribedQuadrilateralOppositeSupplementary.Instantiate(clause));
                    HandleDeducedClauses(worklist, TwoInterceptedArcsHaveCongruentAngles.Instantiate(clause));
                }
                else if (clause is CongruentCircles)
                {
                    HandleDeducedClauses(worklist, CongruentCircleDefinition.Instantiate(clause));
                }
            }

            return(graph);
        }
Example #4
0
        //
        // Checks for SAS given the 5 values
        //
        private static List <EdgeAggregator> InstantiateSAS(Triangle tri1, Triangle tri2, CongruentSegments css1, CongruentSegments css2, CongruentAngles cas)
        {
            List <EdgeAggregator> newGrounded = new List <EdgeAggregator>();

            //
            // All congruence pairs must minimally relate the triangles
            //
            if (!css1.LinksTriangles(tri1, tri2))
            {
                return(newGrounded);
            }
            if (!css2.LinksTriangles(tri1, tri2))
            {
                return(newGrounded);
            }
            if (!cas.LinksTriangles(tri1, tri2))
            {
                return(newGrounded);
            }

            // Is this angle an 'extension' of the actual triangle angle? If so, acquire the normalized version of
            // the angle, using only the triangle vertices to represent the angle
            Angle angleTri1 = tri1.NormalizeAngle(tri1.AngleBelongs(cas));
            Angle angleTri2 = tri2.NormalizeAngle(tri2.AngleBelongs(cas));

            Segment seg1Tri1 = tri1.GetSegment(css1);
            Segment seg1Tri2 = tri2.GetSegment(css1);

            Segment seg2Tri1 = tri1.GetSegment(css2);
            Segment seg2Tri2 = tri2.GetSegment(css2);

            if (!angleTri1.IsIncludedAngle(seg1Tri1, seg2Tri1) || !angleTri2.IsIncludedAngle(seg1Tri2, seg2Tri2))
            {
                return(newGrounded);
            }

            //
            // Construct the corrsesponding points between the triangles
            //
            List <Point> triangleOne = new List <Point>();
            List <Point> triangleTwo = new List <Point>();

            triangleOne.Add(angleTri1.GetVertex());
            triangleTwo.Add(angleTri2.GetVertex());

            triangleOne.Add(seg1Tri1.OtherPoint(angleTri1.GetVertex()));
            triangleTwo.Add(seg1Tri2.OtherPoint(angleTri2.GetVertex()));

            triangleOne.Add(seg2Tri1.OtherPoint(angleTri1.GetVertex()));
            triangleTwo.Add(seg2Tri2.OtherPoint(angleTri2.GetVertex()));

            //
            // Construct the new clauses: congruent triangles and CPCTC
            //
            GeometricCongruentTriangles gcts = new GeometricCongruentTriangles(new Triangle(triangleOne), new Triangle(triangleTwo));

            // Hypergraph
            List <GroundedClause> antecedent = new List <GroundedClause>();

            antecedent.Add(tri1);
            antecedent.Add(tri2);
            antecedent.Add(css1);
            antecedent.Add(css2);
            antecedent.Add(cas);

            newGrounded.Add(new EdgeAggregator(antecedent, gcts, annotation));

            // Add all the corresponding parts as new congruent clauses
            newGrounded.AddRange(CongruentTriangles.GenerateCPCTC(gcts, triangleOne, triangleTwo));

            return(newGrounded);
        }
Example #5
0
        //
        // Checks for SSS given the 5 values
        //
        private static List <EdgeAggregator> InstantiateSSS(Triangle tri1, Triangle tri2, CongruentSegments css1, CongruentSegments css2, CongruentSegments css3)
        {
            List <EdgeAggregator> newGrounded = new List <EdgeAggregator>();

            //
            // All congruence pairs must minimally relate the triangles
            //
            if (!css1.LinksTriangles(tri1, tri2))
            {
                return(newGrounded);
            }
            if (!css2.LinksTriangles(tri1, tri2))
            {
                return(newGrounded);
            }
            if (!css3.LinksTriangles(tri1, tri2))
            {
                return(newGrounded);
            }

            Segment seg1Tri1 = tri1.GetSegment(css1);
            Segment seg1Tri2 = tri2.GetSegment(css1);

            Segment seg2Tri1 = tri1.GetSegment(css2);
            Segment seg2Tri2 = tri2.GetSegment(css2);

            Segment seg3Tri1 = tri1.GetSegment(css3);
            Segment seg3Tri2 = tri2.GetSegment(css3);

            //
            // The vertices of both triangles must all be distinct and cover the triangle completely.
            //
            Point vertex1Tri1 = seg1Tri1.SharedVertex(seg2Tri1);
            Point vertex2Tri1 = seg2Tri1.SharedVertex(seg3Tri1);
            Point vertex3Tri1 = seg1Tri1.SharedVertex(seg3Tri1);

            if (vertex1Tri1 == null || vertex2Tri1 == null || vertex3Tri1 == null)
            {
                return(newGrounded);
            }
            if (vertex1Tri1.StructurallyEquals(vertex2Tri1) ||
                vertex1Tri1.StructurallyEquals(vertex3Tri1) ||
                vertex2Tri1.StructurallyEquals(vertex3Tri1))
            {
                return(newGrounded);
            }

            Point vertex1Tri2 = seg1Tri2.SharedVertex(seg2Tri2);
            Point vertex2Tri2 = seg2Tri2.SharedVertex(seg3Tri2);
            Point vertex3Tri2 = seg1Tri2.SharedVertex(seg3Tri2);

            if (vertex1Tri2 == null || vertex2Tri2 == null || vertex3Tri2 == null)
            {
                return(newGrounded);
            }
            if (vertex1Tri2.StructurallyEquals(vertex2Tri2) ||
                vertex1Tri2.StructurallyEquals(vertex3Tri2) ||
                vertex2Tri2.StructurallyEquals(vertex3Tri2))
            {
                return(newGrounded);
            }

            //
            // Construct the corresponding points between the triangles
            //
            List <Point> triangleOne = new List <Point>();
            List <Point> triangleTwo = new List <Point>();

            triangleOne.Add(vertex1Tri1);
            triangleTwo.Add(vertex1Tri2);

            triangleOne.Add(vertex2Tri1);
            triangleTwo.Add(vertex2Tri2);

            triangleOne.Add(vertex3Tri1);
            triangleTwo.Add(vertex3Tri2);

            //
            // Construct the new clauses: congruent triangles and CPCTC
            //
            GeometricCongruentTriangles gcts = new GeometricCongruentTriangles(new Triangle(triangleOne), new Triangle(triangleTwo));

            // Hypergraph
            List <GroundedClause> antecedent = new List <GroundedClause>();

            antecedent.Add(tri1);
            antecedent.Add(tri2);
            antecedent.Add(css1);
            antecedent.Add(css2);
            antecedent.Add(css3);

            newGrounded.Add(new EdgeAggregator(antecedent, gcts, annotation));

            // Add all the corresponding parts as new congruent clauses
            newGrounded.AddRange(CongruentTriangles.GenerateCPCTC(gcts, triangleOne, triangleTwo));

            return(newGrounded);
        }
Example #6
0
        public static List <EdgeAggregator> InstantiateTransitive(CongruentTriangles cts1, CongruentTriangles cts2)
        {
            List <EdgeAggregator> newGrounded = new List <EdgeAggregator>();

            Dictionary <Point, Point> firstTriangleCorrespondence  = cts1.HasTriangle(cts2.ct1);
            Dictionary <Point, Point> secondTriangleCorrespondence = cts1.HasTriangle(cts2.ct2);

            // Same Congruence
            if (firstTriangleCorrespondence != null && secondTriangleCorrespondence != null)
            {
                return(newGrounded);
            }

            // No relationship between congruences
            if (firstTriangleCorrespondence == null && secondTriangleCorrespondence == null)
            {
                return(newGrounded);
            }

            // Acquiring the triangle that links the congruences
            Triangle     linkTriangle = firstTriangleCorrespondence != null ? cts2.ct1 : cts2.ct2;
            List <Point> linkPts      = linkTriangle.points;

            Dictionary <Point, Point> otherCorrGCTSpts = cts1.OtherTriangle(linkTriangle);
            Dictionary <Point, Point> otherCorrCTSpts  = cts2.OtherTriangle(linkTriangle);

            // Link the other triangles together in a new congruence
            Dictionary <Point, Point> newCorrespondence = new Dictionary <Point, Point>();

            foreach (Point linkPt in linkPts)
            {
                Point otherGpt;
                if (!otherCorrGCTSpts.TryGetValue(linkPt, out otherGpt))
                {
                    throw new ArgumentException("Something strange happened in Triangle correspondence.");
                }

                Point otherCpt;
                if (!otherCorrCTSpts.TryGetValue(linkPt, out otherCpt))
                {
                    throw new ArgumentException("Something strange happened in Triangle correspondence.");
                }

                newCorrespondence.Add(otherGpt, otherCpt);
            }

            List <Point> triOne = new List <Point>();
            List <Point> triTwo = new List <Point>();

            foreach (KeyValuePair <Point, Point> pair in newCorrespondence)
            {
                triOne.Add(pair.Key);
                triTwo.Add(pair.Value);
            }

            //
            // Create the new congruence
            //
            AlgebraicCongruentTriangles acts = new AlgebraicCongruentTriangles(new Triangle(triOne), new Triangle(triTwo));

            List <GroundedClause> antecedent = new List <GroundedClause>();

            antecedent.Add(cts1);
            antecedent.Add(cts2);

            newGrounded.Add(new EdgeAggregator(antecedent, acts, annotation));

            return(newGrounded);
        }