//// //// 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? // } //} } }
// // 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); }
// // 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); }
// // 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); }
// // 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); }
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); }