Mercurial > hg > Applications > Lite
comparison bdtstd.pl @ 2:1c57a78f1d98
Initial revision
author | kono |
---|---|
date | Thu, 18 Jan 2001 23:27:24 +0900 |
parents | |
children | 07d6c4c5654b |
comparison
equal
deleted
inserted
replaced
1:683efd6f9a81 | 2:1c57a78f1d98 |
---|---|
1 % | |
2 /* | |
3 Copyright (C) 1991, Shinji Kono, Sony Computer Science Laboratory, Inc. | |
4 The University, Newcastle upton Tyne | |
5 | |
6 Everyone is permitted to copy and distribute verbatim copies | |
7 of this license, but changing it is not allowed. You can also | |
8 use this wording to make the terms for other programs. | |
9 | |
10 send your comments to kono@csl.sony.co.jp | |
11 $Id$ | |
12 */ | |
13 % ITL subterm standarization with BDT | |
14 % | |
15 % Fri Jun 21 10:32:58 BST 1991 | |
16 % | |
17 % a standard form of ITL, based on subterm classification | |
18 % | |
19 % | |
20 subterm_init :- | |
21 abolish(sb,2), | |
22 asserta((sb([],-1))), | |
23 abolish(sbn,1), | |
24 asserta(sbn(0)). | |
25 | |
26 std_check(I,J) :- | |
27 sb(I,J),!. | |
28 std_check(I,N1) :- | |
29 retract(sbn(N)),N1 is N+1,asserta(sbn(N1)), | |
30 assertz(sb(I,N1)),!. | |
31 | |
32 itlstd(P,List) :- | |
33 sbdt(P,List). | |
34 | |
35 % BDT classification of subterm | |
36 | |
37 sbdt(true,true):-!. | |
38 sbdt(false,false):-!. | |
39 sbdt(P,F) :- atomic(P),!,F= ?(P,true,false). | |
40 sbdt(?(C,T,F),?(C,T,F)) :- !. | |
41 sbdt(not(P),F) :- !,sbdt(P,F0),sbdt_not(F0,F),!. | |
42 sbdt_not(true,false). | |
43 sbdt_not(false,true). | |
44 sbdt_not(F,?(H,A1,B1)):- | |
45 arg(1,F,H),arg(2,F,A),arg(3,F,B), | |
46 sbdt_not(A,A1),sbdt_not(B,B1). | |
47 sbdt((P,Q),F) :- !, | |
48 sbdt(P,P0),sbdt(Q,Q0), | |
49 sbdt_and(P0,Q0,F),!. | |
50 sbdt_and(false,_,false):-!. | |
51 sbdt_and(_,false,false):-!. | |
52 sbdt_and(true,T,T):-!. | |
53 sbdt_and(T,true,T):-!. | |
54 sbdt_and(P,Q,R) :-!, | |
55 arg(1,P,PF),arg(1,Q,QF), | |
56 sbdt_and(PF,QF,P,Q,R). | |
57 sbdt_and(PF,QF,P,Q,R):-PF @< QF,!, | |
58 sbdt_and(QF,PF,Q,P,R). | |
59 sbdt_and(PF,QF,P,Q,?(QF,R0,R1)):-PF @> QF,!, | |
60 arg(2,Q,Q0),arg(3,Q,Q1), | |
61 sbdt_and(Q0,P,R0), | |
62 sbdt_and(Q1,P,R1). | |
63 sbdt_and(PF,PF,P,Q,?(PF,R0,R1)):- | |
64 arg(2,P,P0),arg(3,P,P1), | |
65 arg(2,Q,Q0),arg(3,Q,Q1), | |
66 sbdt_and(P0,Q0,R0), | |
67 sbdt_and(P1,Q1,R1). | |
68 sbdt((P;Q),F) :- !, | |
69 sbdt(P,P0),sbdt(Q,Q0), | |
70 sbdt_or(P0,Q0,F),!. | |
71 sbdt_or(true,_,true):-!. | |
72 sbdt_or(_,true,true):-!. | |
73 sbdt_or(false,T,T):-!. | |
74 sbdt_or(T,false,T):-!. | |
75 sbdt_or(P,Q,R) :-!, | |
76 arg(1,P,PF),arg(1,Q,QF), | |
77 sbdt_or(PF,QF,P,Q,R). | |
78 sbdt_or(PF,QF,P,Q,R):-PF @< QF,!, | |
79 sbdt_or(QF,PF,Q,P,R). | |
80 sbdt_or(PF,QF,P,Q,?(QF,R0,R1)):-PF @> QF,!, | |
81 arg(2,Q,Q0),arg(3,Q,Q1), | |
82 sbdt_or(Q0,P,R0), | |
83 sbdt_or(Q1,P,R1). | |
84 sbdt_or(PF,PF,P,Q,?(PF,R0,R1)):- | |
85 arg(2,P,P0),arg(3,P,P1), | |
86 arg(2,Q,Q0),arg(3,Q,Q1), | |
87 sbdt_or(P0,Q0,R0), | |
88 sbdt_or(P1,Q1,R1). | |
89 sbdt((P&Q), ?(N,true,false)) :-!, | |
90 sbdt(P,P1),sbdt(Q,Q1), % projection touch later part of chop | |
91 std_check((P1&Q1),N). | |
92 %sbdt(@(Q), ?(N,true,false)) :-!, % Don't check next part now | |
93 % std_check(@(Q),N). % this makes everything very slow | |
94 %sbdt(*(Q), ?(N,true,false)) :-!, % Don't check next part now | |
95 % std_check(*(Q),N). % this makes everything very slow | |
96 %sbdt(free_fin(Q), ?(N,true,false)) :-!, | |
97 % std_check(free_fin(Q),N). | |
98 % bottom up development is effective for quantifier | |
99 sbdt(exists(P,Q), ?(N,true,false)) :-!, | |
100 sbdt(Q,QF), | |
101 std_check(exists(P,QF),N). | |
102 sbdt(proj(P,Q), ?(N,true,false)) :-!, | |
103 sbdt(Q,QF), % P part is fixed | |
104 std_check(proj(P,QF),N). | |
105 sbdt(prefix(P), ?(N,true,false)) :-!, | |
106 sbdt(P,PF), % P part is fixed | |
107 std_check(prefix(PF),N). | |
108 % Simple Functor including Regular variable and state | |
109 sbdt(Func,F) :- functor(Func,_,1),!,F= ?(N,true,false), | |
110 std_check(Func,N). | |
111 sbdt(Func,F) :- functor(Func,_,2),!,F= ?(N,true,false), | |
112 std_check(Func,N). | |
113 sbdt(Def,true) :- | |
114 write('bdtstd error: '),write(Def),nl. | |
115 | |
116 sbterm :- | |
117 listing(sb/2),listing(itl_state/2). | |
118 | |
119 | |
120 bdt2itl(B,F) :- number(B),!,sb(F0,B), | |
121 bdt2itl(F0,F). | |
122 bdt2itl(?(IF,THEN,ELSE),F) :- | |
123 bdt2itl(IF,IF0),bdt2itl(THEN,THEN0),bdt2itl(ELSE,ELSE0), | |
124 bdt2itl_opt(IF0,THEN0,ELSE0,F). | |
125 % little more readable representation | |
126 bdt2itl_opt(IF,true,false,IF) :- !. | |
127 bdt2itl_opt(IF,false,true,not(IF)) :- !. | |
128 bdt2itl_opt(IF,true,ELSE,(IF;ELSE)) :- !. | |
129 bdt2itl_opt(IF,THEN,false,(IF,THEN)) :- !. | |
130 bdt2itl_opt(IF,false,ELSE,(not(IF);ELSE)) :- !. | |
131 bdt2itl_opt(IF,THEN,true,(not(IF),THEN)) :- !. | |
132 bdt2itl_opt(IF,THEN,ELSE,?(IF,THEN,ELSE)) :- !. | |
133 bdt2itl(B,F) :- atom(B),!,F=B. | |
134 bdt2itl(B,F) :- | |
135 functor(B,H,N),functor(F,H,N),bdt2itl_subterm(N,N,B,F). | |
136 bdt2itl_subterm(0,_,_,_) :- !. | |
137 bdt2itl_subterm(N,N1,F,F0) :- | |
138 N0 is N-1, | |
139 arg(N,F,A),arg(N,F0,A0), | |
140 bdt2itl(A,A0),bdt2itl_subterm(N0,N1,F,F0). | |
141 | |
142 % BDT end % |