Synthetic Geometry

The Wolfram Language provides not only extensive support for analytic geometry, but also support for the symbolic representation of synthetic geometry scenes in a form suitable for automated coordinate-independent reasoning.

Scene Representation and Visualization

Synthetic geometry scenes are represented in the Wolfram Language with (RefLink[GeometricScene, paclet:ref/GeometricScene]). Scenes contain parameters representing named points and quantities, as well as hypotheses consisting of symbolic 2D regions and assertions involving those parameters. Conclusions can also be added to represent geometric theorems or conjectures that those hypotheses entail. Particular instances of a scene can be represented by specifying coordinates and values for all of the parameters appearing in the scene. Multiple instances of the same scene can be represented with a single (RefLink[GeometricScene, paclet:ref/GeometricScene]) object.

Wrapper for geometric scenes.

The simplest geometric scenes consist of only a list of points and a list of hypotheses.

Here is a scene consisting of a circumscribed triangle with one side on the diameter:

scene=GeometricScene[{a,b,c,o},{Triangle[{a,b,c}],CircleThrough[{a,b,c},o],o==Midpoint[{a,c}]}];

Geometric scenes can be visualized by finding a particular instance of the scene using (RefLink[RandomInstance, paclet:ref/RandomInstance]).

Function to find instances of a geometric scene.

This finds a random instance of the scene:

RandomInstance[scene]

This finds several instances of the scene:

RandomInstance[scene,5]

Many 2D regions can be used as hypotheses in a geometric scene. All regions appearing in the hypotheses of a geometric scene are assumed to be nondegenerate and are displayed in instances of that scene:

2D regions supported in (RefLink[GeometricScene, paclet:ref/GeometricScene]).

This is a more complex geometric scene:

scene2=GeometricScene[{a,b,c,h,l,p},{Triangle[{a,b,c}],l∈AngleBisector[{a,b,c}],h==TriangleConstruct[{a,b,c},"Orthocenter"],p==Midpoint[{a,c}]}];

RandomInstance[scene2,RandomSeeding->23]

Hypotheses can also be geometric assertions or equations involving geometric quantities defined on elements of the scene.

Geometric quantities supported by (RefLink[GeometricScene, paclet:ref/GeometricScene]).

Assertions supported by (RefLink[GeometricScene, paclet:ref/GeometricScene]).

This is the scene description for Brahmagupta's theorem:

scene3=GeometricScene[{a,b,c,d,e,f,m},{GeometricAssertion[Polygon[{a,b,c,d}],"Cyclic"],GeometricAssertion[{Line[{a,m,c}],Line[{b,m,d}]},"Perpendicular"],GeometricAssertion[{Line[{f,m,e}],Line[{b,e,c}]},"Perpendicular"],Line[{a,f,d}]}];
RandomInstance[scene3,RandomSeeding->9]

(RefLink[GeometricScene, paclet:ref/GeometricScene]) also supports style:

Specifying styles within (RefLink[GeometricScene, paclet:ref/GeometricScene]).

Find a perfect polygon dissection:

RandomInstance[GeometricScene[{a,b,c,d,g,e,f},{
p0==Polygon[{e,g,f}],
p1==Style[Polygon[{a,b,c}],Red],
p2==Style[Polygon[{b,c,d}],Green],
p3==Style[Polygon[{d,c,g}],Blue],
p4==Style[Polygon[{g,c,a}],Magenta],
p5==Style[Polygon[{e,d,b}],Cyan],
p6==Style[Polygon[{g,a,f}],Yellow],
GeometricAssertion[{p0,p1,p2,p3,p4,p5,p6},"Similar"]
}
],RandomSeeding->3]

Finding Conjectures

The Wolfram Language can use these scene descriptions to find conjectures that may hold for a geometric scene.

Function to find conjectures for a geometric scene.

Discover Thales's theorem:

scene=GeometricScene[{a,b,c,o},{Triangle[{a,b,c}],CircleThrough[{a,b,c},o],o==Midpoint[{a,c}]}];

RandomInstance[scene]

FindGeometricConjectures[%,GeometricAssertion[_,"Perpendicular"]]["Conclusions"]

Discover Brahmagupta's theorem:

scene3=GeometricScene[{a,b,c,d,e,f,m},{GeometricAssertion[Polygon[{a,b,c,d}],"Cyclic"],GeometricAssertion[{Line[{a,m,c}],Line[{b,m,d}]},"Perpendicular"],GeometricAssertion[{Line[{f,m,e}],Line[{b,e,c}]},"Perpendicular"],Line[{a,f,d}]}];

RandomInstance[scene3,RandomSeeding->9]

FindGeometricConjectures[%,_==_Midpoint]["Conclusions"]

Discover Pappus's hexagon theorem:

scene4=GeometricScene[{a,b,c,d,e,f,x,y,z},{Line[{{a,b,c},{d,e,f},{a,x,e},{b,x,d},{a,y,f},{c,y,d},{b,z,f},{c,z,e}}],Style[InfiniteLine[{x,z}],Red]}];

RandomInstance[scene4]

FindGeometricConjectures[%,GeometricAssertion[_,"Collinear"]]["Conclusions"]

Discover Kosnita's theorem:

scene5=GeometricScene[{o,a,b,c,oa,ob,oc,k},{o==TriangleCenter[{a,b,c},"Circumcenter"],oa==TriangleCenter[{o,b,c},"Circumcenter"],ob==TriangleCenter[{a,o,c},"Circumcenter"],oc==TriangleCenter[{a,b,o},"Circumcenter"],GeometricAssertion[{a,k,oa},"Collinear"],GeometricAssertion[{b,k,ob},"Collinear"],
Style[InfiniteLine[{c,oc}],Red]}];

RandomInstance[scene5,RandomSeeding->5]

FindGeometricConjectures[%,GeometricAssertion[_,"Collinear"]]["Conclusions"]

Discover the Finsler–Hadwiger theorem:

scene6=GeometricScene[{a,b,c,d,bb,cc,dd,q,r,s,t},{GeometricAssertion[{Polygon[{a,b,c,d}],Polygon[{a,bb,cc,dd}]},"Regular","Counterclockwise"],q==Midpoint[{bb,d}],r==Midpoint[{a,c}],s==Midpoint[{b,dd}],t==Midpoint[{a,cc}],Style[Polygon[{q,r,s,t}],Opacity[0.4],Red]}];

RandomInstance[scene6,RandomSeeding->1]

FindGeometricConjectures[%,GeometricAssertion[_,"Regular"]]["Conclusions"]