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