which included commits to RCS files with non-trunk default branches. git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@5 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
		
			
				
	
	
		
			303 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Prolog
		
	
	
	
	
	
			
		
		
	
	
			303 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Prolog
		
	
	
	
	
	
% geomtric constraints following Tarskis axioms for geometry
 | 
						|
% thom fruehwirth ECRC 950722
 | 
						|
% thom fruehwirth LMU 980207, 980312 for Sicstus CHR
 | 
						|
 | 
						|
:- use_module(library(chr)).
 | 
						|
 | 
						|
handler tarski.
 | 
						|
 | 
						|
 | 
						|
constraints b/3, ol/3. 
 | 
						|
% b(X,Y,Z)  3 points are different and collinear, on same line in that order
 | 
						|
% ol(X,Y,L) <=> X and Y are different points on line L
 | 
						|
 | 
						|
b(X,Y,Z) <=> ol(X,Y,L),ol(Y,Z,L).
 | 
						|
 | 
						|
irreflexivity  @ ol(X,X,L) <=> fail. % true.  % ol(X,L).
 | 
						|
turn @ ol(X,Y,(-L)) <=> ol(Y,X,L).
 | 
						|
same_line @ ol(X,Y,L1)\ol(X,Y,L2) <=> L1=L2.
 | 
						|
same_line @ ol(X,Y,L1)\ol(Y,X,L2) <=> L1\==L2 | L2=(-L1). % turn direction of L2
 | 
						|
antisymmetry @ ol(X,Y,L),ol(Y,X,L) ==> X=Y. % corresponds to axiom a1
 | 
						|
% transitivity only for points on the same line
 | 
						|
transitivity @ ol(X,Y,L),ol(Y,Z,L) ==> ol(X,Z,L). % corresponds to axiom a2
 | 
						|
 | 
						|
 | 
						|
constraints e/4, pd/3. 
 | 
						|
% e(X,Y,U,V)  line segments X-Y and U-V have same nonzero length
 | 
						|
% ls(X,Y,D) the different points X and Y have nonzero distance D from each other
 | 
						|
 | 
						|
e(X,Y,U,V) <=> pd(X,Y,D),pd(U,V,D).
 | 
						|
 | 
						|
orient_pd @ ol(X,Y,L)\pd(Y,X,D) <=> pd(X,Y,D).
 | 
						|
 | 
						|
% simple cases
 | 
						|
 | 
						|
idempotence @ pd(X,Y,D1)\pd(X,Y,D2)<=>D1=D2.  % corresponds to axiom a4 and a6
 | 
						|
idempotence @ pd(X,Y,D1)\pd(Y,X,D2)<=>D1=D2.
 | 
						|
 | 
						|
zero @ pd(X,X,D) <=> fail. % corresponds to axiom a5
 | 
						|
 | 
						|
% more like that is missing
 | 
						|
pd(X,Y,D),ol(X,Y,L),pd(X,Z,D),ol(X,Z,L) ==> Y=Z.
 | 
						|
pd(X,Y,D),ol(X,Y,L),pd(Z,Y,D),ol(Z,Y,L) ==> Y=Z.
 | 
						|
 | 
						|
 | 
						|
% EXAMPLES =============================================================
 | 
						|
 | 
						|
% simple 2-dimensional geometric objects (in German)
 | 
						|
 | 
						|
ld(X,Y,D):- ld(X,Y,D,_L).
 | 
						|
ld(X,Y,D,L):- pd(X,Y,D),ol(X,Y,L).
 | 
						|
 | 
						|
polygon([]).
 | 
						|
polygon([_]).
 | 
						|
polygon([X,Y|P]):-
 | 
						|
	ol(X,Y,L),
 | 
						|
	polygon([Y|P]).
 | 
						|
 | 
						|
gleichseiter([],D).
 | 
						|
gleichseiter([_],D).
 | 
						|
gleichseiter([X,Y|P],D):-
 | 
						|
	pd(X,Y,D),
 | 
						|
	gleichseiter([Y|P],D).
 | 
						|
 | 
						|
dreieck(A,B,C):- polygon([A,B,C,A]).
 | 
						|
 | 
						|
gleichdreieck(A,B,C,W):- dreieck(A,B,C), gleichseiter([A,B,C,A],W).
 | 
						|
 | 
						|
viereck(A,B,C,D):- polygon([A,B,C,D,A]).
 | 
						|
 | 
						|
konkaves_viereck(A,B,C,D,E):-
 | 
						|
     viereck(A,B,C,D),
 | 
						|
     b(D,E,B), b(A,E,C).  %diagonals
 | 
						|
 | 
						|
quadrat(A,B,C,D,E,U,V):-
 | 
						|
     konkaves_viereck(A,B,C,D,E),
 | 
						|
     gleichseiter([A,B,C,D,A],U),
 | 
						|
     gleichseiter([A,E,C],V),
 | 
						|
     gleichseiter([D,E,B],V).
 | 
						|
 | 
						|
rechtdrei(A,B,C,U):-
 | 
						|
	dreieck(A,B,C),
 | 
						|
	gleichseiter([A,_,_,B],U), %3*U
 | 
						|
	gleichseiter([B,_,_,_,C],U), %4*U
 | 
						|
	gleichseiter([C,_,_,_,_,A],U). %5*U
 | 
						|
 | 
						|
/*
 | 
						|
| ?- b(X,Y,X).
 | 
						|
 | 
						|
no
 | 
						|
| ?- b(X,X,Y).
 | 
						|
 | 
						|
no
 | 
						|
| ?- b(X,Y,Z),b(X,Z,Y).
 | 
						|
 | 
						|
no
 | 
						|
| ?- b(X,Y,Z),b(Z,Y,X).
 | 
						|
 | 
						|
ol(X,Y,_A),
 | 
						|
ol(Y,Z,_A),
 | 
						|
ol(X,Z,_A) ? 
 | 
						|
 | 
						|
yes
 | 
						|
| ?- b(X,Y,Z),b(X,Y,Z).
 | 
						|
 | 
						|
ol(X,Y,_A),
 | 
						|
ol(Y,Z,_A),
 | 
						|
ol(X,Z,_A) ?
 | 
						|
 | 
						|
| ?- b(X,Y,U),b(Y,Z,U).
 | 
						|
 | 
						|
ol(X,Y,_A),
 | 
						|
ol(Y,U,_A),
 | 
						|
ol(X,U,_A),
 | 
						|
ol(Y,Z,_A),
 | 
						|
ol(Z,U,_A),
 | 
						|
ol(X,Z,_A) ? 
 | 
						|
 | 
						|
yes
 | 
						|
| ?- b(X,Y,Z),b(X,Y,U).
 | 
						|
 | 
						|
ol(X,Y,_A),
 | 
						|
ol(Y,Z,_A),
 | 
						|
ol(X,Z,_A),
 | 
						|
ol(Y,U,_A),
 | 
						|
ol(X,U,_A) ? 
 | 
						|
 | 
						|
yes
 | 
						|
| ?- ol(X,Y,L),ol(X,Z,L).
 | 
						|
 | 
						|
ol(X,Y,L),
 | 
						|
ol(X,Z,L) ? 
 | 
						|
 | 
						|
yes
 | 
						|
| ?- ol(X,Y,L),ol(X,Z,L), (ol(Y,Z,L);ol(Z,Y,L)).
 | 
						|
 | 
						|
ol(X,Y,L),
 | 
						|
ol(X,Z,L),
 | 
						|
ol(Y,Z,L) ? ;
 | 
						|
 | 
						|
ol(X,Y,L),
 | 
						|
ol(X,Z,L),
 | 
						|
ol(Z,Y,L) ? ;
 | 
						|
 | 
						|
no
 | 
						|
| ?- ol(X,Y,L),ol(Y,U,L1),ol(U,V,L).
 | 
						|
 | 
						|
ol(X,Y,L),
 | 
						|
ol(Y,U,L1),
 | 
						|
ol(U,V,L) ? ;
 | 
						|
 | 
						|
no
 | 
						|
| ?- ol(X,Y,L),ol(Y,U,L1),ol(U,V,L1).
 | 
						|
 | 
						|
ol(X,Y,L),
 | 
						|
ol(Y,U,L1),
 | 
						|
ol(U,V,L1),
 | 
						|
ol(Y,V,L1) ? 
 | 
						|
 | 
						|
yes
 | 
						|
| ?- ol(V,Y,L),ol(U,Y,L1),ol(U,V,L1).
 | 
						|
 | 
						|
ol(V,Y,L),
 | 
						|
ol(U,Y,L1),
 | 
						|
ol(U,V,L1) ? ;
 | 
						|
 | 
						|
no
 | 
						|
 | 
						|
*/
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
| ?- e(X,Y,Y,X).
 | 
						|
 | 
						|
pd(X,Y,_A) ? 
 | 
						|
 | 
						|
yes
 | 
						|
| ?- e(X,Y,X,Y).
 | 
						|
 | 
						|
pd(X,Y,_A) ? 
 | 
						|
 | 
						|
yes
 | 
						|
| ?- e(X,Y,Z,Z).
 | 
						|
 | 
						|
no
 | 
						|
| ?- e(X,Y,A,B),e(X,Y,A,B).
 | 
						|
 | 
						|
pd(X,Y,_A),
 | 
						|
pd(A,B,_A) ? 
 | 
						|
 | 
						|
yes
 | 
						|
| ?- e(X,Y,A,B),e(Y,X,B,A).
 | 
						|
 | 
						|
pd(X,Y,_A),
 | 
						|
pd(A,B,_A) ? 
 | 
						|
 | 
						|
yes
 | 
						|
| ?- e(X,Y,Z,U),e(X,Y,V,W).
 | 
						|
 | 
						|
pd(X,Y,_A),
 | 
						|
pd(Z,U,_A),
 | 
						|
pd(V,W,_A) ? 
 | 
						|
 | 
						|
yes
 | 
						|
| ?- pd(X,Y,D1),pd(Y,Z,D2).
 | 
						|
 | 
						|
pd(X,Y,D1),
 | 
						|
pd(Y,Z,D2) ? 
 | 
						|
 | 
						|
yes
 | 
						|
| ?- pd(X,Y,D1),pd(Y,Z,D2),ol(X,Y,L),ol(Y,Z,L),pd(X,Z,D3).
 | 
						|
 | 
						|
pd(X,Y,D1),
 | 
						|
pd(Y,Z,D2),
 | 
						|
ol(X,Y,L),
 | 
						|
ol(Y,Z,L),
 | 
						|
ol(X,Z,L),
 | 
						|
pd(X,Z,D3) ? 
 | 
						|
 | 
						|
yes
 | 
						|
| ?- e(X,Y,U,V),e(X,Y,X,U).
 | 
						|
 | 
						|
pd(X,Y,_A),
 | 
						|
pd(U,V,_A),
 | 
						|
pd(X,U,_A) ? 
 | 
						|
 | 
						|
yes
 | 
						|
| ?- e(X,Y,U,V),e(X,Y,X,U),b(X,Y,U).
 | 
						|
 | 
						|
no
 | 
						|
| ?- e(X,Y,U,V),e(X,Y,X,U),b(X,Y,V).
 | 
						|
 | 
						|
pd(X,Y,_A),
 | 
						|
pd(U,V,_A),
 | 
						|
pd(X,U,_A),
 | 
						|
ol(X,Y,_B),
 | 
						|
ol(Y,V,_B),
 | 
						|
ol(X,V,_B) ? 
 | 
						|
 | 
						|
yes
 | 
						|
| ?- e(X,Y,U,V),e(X,Y,X,U),b(X,U,Y).
 | 
						|
 | 
						|
no
 | 
						|
 | 
						|
| ?- pd(X,Y,D),pd(Y,Z,D),pd(X,Z,D),ol(X,Y,L),ol(Y,Z,L).
 | 
						|
 | 
						|
no
 | 
						|
 | 
						|
| ?- pd(X,Y,D),ol(X,Y,L),pd(X,Z,D),ol(X,Z,L).
 | 
						|
 | 
						|
Z = Y,
 | 
						|
pd(X,Y,D),
 | 
						|
ol(X,Y,L) ? 
 | 
						|
 | 
						|
yes
 | 
						|
| ?- e(X,Y,X,Z), b(X,Y,Z).
 | 
						|
 | 
						|
no
 | 
						|
 | 
						|
| ?- e(X,Y,X,Z), b(X,Y,U), b(X,Z,U).
 | 
						|
 | 
						|
Z = Y,
 | 
						|
pd(X,Y,_A),
 | 
						|
ol(X,U,_B),
 | 
						|
ol(X,Y,_B),
 | 
						|
ol(Y,U,_B) ? 
 | 
						|
 | 
						|
yes
 | 
						|
 | 
						|
*/
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
| ?- gleichdreieck(A,B,C,W),gleichdreieck(A,C,D,V),gleichdreieck(B,C,E,U).
 | 
						|
V = U,
 | 
						|
W = U,
 | 
						|
...
 | 
						|
% cannot find out that D-C-E is on same line
 | 
						|
 | 
						|
| ?- konkaves_viereck(A,B,C,D,E),gleichdreieck(A,B,C,W),gleichdreieck(A,B,E,W).
 | 
						|
 | 
						|
E = C,
 | 
						|
 | 
						|
| ?- quadrat(A,B,C,D,E,U,V),gleichdreieck(A,B,C,W).
 | 
						|
 | 
						|
W = U,
 | 
						|
% does not know that diagonal is longer than sides
 | 
						|
 | 
						|
| ?- quadrat(A,B,C,D,E,U,V),gleichdreieck(A,B,C,W), 
 | 
						|
          e(A,D,A,D1), b(E,D1,C).
 | 
						|
 | 
						|
| ?- quadrat(A,B,C,D,E,U,V),gleichdreieck(A,B,C,W),gleichdreieck(A,B,E,W1).
 | 
						|
 | 
						|
no
 | 
						|
 | 
						|
| ?- rechtdrei(A,B,C,U),gleichdreieck(A,B,C,W).
 | 
						|
% no constraining, since it is not known that U+U=/=U
 | 
						|
 | 
						|
*/
 | 
						|
 | 
						|
 | 
						|
% end of file handler tarski.pl ------------------------------------- |