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