%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 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 %%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%