%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% RUN and use something like:
% uc([a,b,c],[a,c,b],_)
% uc([a,b,c],[a,c,b],M)
% uc([a,b,c],[a,b,c],M)
% uc([a,b,c],[c,b,a],M)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Nicolaie Popescu-Bodorin, October 2009.
% http:// fmi.spiruharet.ro/bodorin/
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DOMAINS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% nil - empty atom
dsym = symbol % a symbol which encodes a given symbolic distance (other than nil)
str = string %
r = real % real number
p = symbol % point
pl = p* % list of points
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% END DOMAINS %%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
PREDICATES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% GEOMETRIC OBJECTS: %%%%%%%%%%%%%%%%%%%%%
point(p)
points(pl)
segment(pl)
angle(pl)
triangle(pl)
isotri(pl) % isosceles triangle
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% METHODS / ARGUMENTS: %%%%%%%%%%%%%%%%%%%
segmc(pl,pl) % congruence of segments
uc(pl,pl) % congruence of angles (without argument message)
uc(pl,pl,str) % congruence of angles (with argument message)
dist(p,p,r) % numeric distance between two points
ddist(p,p,dsym) % symbolic distance between two points
sss(pl,pl) % SSS argument for triangle congruence
sas(pl,pl) % SAS argument for triangle congruence
ttricsss(pl,pl) % see below
dif(pl,pl) % test for non-identical triangles
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% OUTPUT: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
cprint(char,pl,string,char,pl)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% END PREDICATES %%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CLAUSES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% triangle definition:
triangle([X,Y,Z]):-X<>Y,X<>Z,Y<>Z,points([X,Y,Z]).
% angle definition:
angle([X,Y,Z]):-triangle([X,Y,Z]).
% segment definition:
segment([X,Y]):-X<>Y;
dist(X,Y,D),D>0;
ddist(X,Y,D),not(D=nil).
% congruence of two given segments:
segmc([A,B],[C,D]):-
A=C,B=D;
A=D,B=C;
dist(A,B,N),dist(C,D,N);
ddist(A,B,S),ddist(C,D,S);
ddist(B,A,S),ddist(C,D,S);
ddist(B,A,S),ddist(D,C,S);
ddist(A,B,S),ddist(D,C,S).
% point definition:
points([_]):-!.
points([H|T]):-point(H),points(T).
% distance:
dist(X,X,0).
% isosceles triangle (definition):
isotri([A,B,C]):-
dist(A,B,D),dist(C,B,D),!;
ddist(A,B,D),ddist(C,B,D).
% decides when the two given triangles are congruent using SSS (LLL) argument;
% SSS stands for Side-Side-Side argument for triangle congruence;
sss([X,Y,Z],[A,B,C]):-
segmc([X,Y],[A,B]),
segmc([Y,Z],[B,C]),
segmc([X,Z],[A,C]).
%uc([X,Y,Z],[A,B,C]).
% decides when the two given triangles are congruent using SAS (LUL) argument;
% SAS stands for Side-Angle-Side argument for triangle congruence;
sas([X,Y,Z],[A,B,C]):-dif([X,Y,Z],[A,B,C]),
segmc([X,Y],[A,B]),
segmc([Y,Z],[B,C]),
uc([X,Y,Z],[A,B,C]).
% congruence of angles:
uc([X,Y,Z],[X,Y,Z]):-!.
uc([X,Y,Z],[Z,Y,X]):-!.
%uc([X,Y,Z],[A,B,C]):-sas([X,Y,Z],[A,B,C]),!.
%uc(U1,U2):-dif(U1,U2),uc(U1,U2,MSG).
uc([X,Y,Z],[X,Y,Z],"Identical"):-!.
uc([X,Y,Z],[Z,Y,X],"Reversed"):-!.
uc([X,Y,Z],[A,B,C],M):-
ttricsss([X,Y,Z],[A,B,C]),M="1-SSS",cprint('T',[X,Y,Z]," SSS ",'T',[A,B,C]);
sas([Y,X,Z],[B,A,C]),M="2-SAS",cprint('T',[Y,X,Z]," SAS ",'T',[B,A,C]),!;
sas([Y,X,Z],[C,A,B]),M="3-SAS",cprint('T',[Y,X,Z]," SAS ",'T',[C,A,B]),!;
sas([Z,X,Y],[C,A,B]),M="4-SAS",cprint('T',[Z,X,Y]," SAS ",'T',[C,A,B]),!;
sas([Y,X,Z],[B,A,C]),M="5-SAS",cprint('T',[Y,X,Z]," SAS ",'T',[B,A,C]).
% print output:
cprint(E, [X,Y,Z], STR,D, [A,B,C]):- nl,write(E),write(X),write(Y),write(Z),write(STR),write(D),write(A),write(B),write(C),nl.
% decides if there exist two hypostases of the two given triangles that are congruent according to SSS (LLL) argument;
% SSS stands for Side-Side-Side argument for triangle congruence;
ttricsss([X,Y,Z],[A,B,C]):-
sss([Z,X,Y],[C,A,B]),!;
sss([Y,X,Z],[B,A,C]),!;
sss([Y,Z,X],[B,C,A]),!;
sss([X,Z,Y],[A,C,B]).
% different triangles:
dif([X,Y,Z],[A,B,C]):-
X<>A;
Y<>B;
Z<>C.
% Effective Hypotheses:%%%%%%%%%
% a triangle:
point(a).
point(b).
point(c).
% with two congruent sides of arbitrary length:
ddist(b,a,somedist).
ddist(c,a,somedist).
% arbitrary length of the third side:
ddist(b,c,otherdist).
% End Hypotheses %%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% END CLAUSES %%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%