This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
vsc e5f4633c39 This commit was generated by cvs2svn to compensate for changes in r4,
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
2001-04-09 19:54:03 +00:00

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