1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.qedeq.kernel.bo.logic.proof.finder;
17
18 import java.util.ArrayList;
19 import java.util.List;
20
21 import org.qedeq.kernel.bo.common.Element2Utf8;
22 import org.qedeq.kernel.bo.log.ModuleLogListener;
23 import org.qedeq.kernel.se.base.list.Element;
24 import org.qedeq.kernel.se.base.module.Add;
25 import org.qedeq.kernel.se.base.module.FormalProofLineList;
26 import org.qedeq.kernel.se.base.module.Reason;
27 import org.qedeq.kernel.se.base.module.SubstPred;
28 import org.qedeq.kernel.se.dto.module.AddVo;
29 import org.qedeq.kernel.se.dto.module.FormalProofLineListVo;
30 import org.qedeq.kernel.se.dto.module.FormalProofLineVo;
31 import org.qedeq.kernel.se.dto.module.FormulaVo;
32 import org.qedeq.kernel.se.dto.module.ModusPonensVo;
33 import org.qedeq.kernel.se.dto.module.SubstPredVo;
34
35
36
37
38
39
40
41 public final class ProofFinderUtility {
42
43
44 private List new2Old;
45
46
47
48
49
50 private ProofFinderUtility() {
51
52 }
53
54
55
56
57
58
59
60
61
62
63 public static FormalProofLineList shortenProof(final List lines, final List reasons,
64 final ModuleLogListener log, final Element2Utf8 trans) {
65 return (new ProofFinderUtility()).shorten(lines, reasons, log, trans);
66 }
67
68 private FormalProofLineList shorten(final List lines, final List reasons,
69 final ModuleLogListener log, final Element2Utf8 trans) {
70 final boolean[] used = new boolean[lines.size()];
71 int n = lines.size() - 1;
72 used[n] = true;
73 while (n >= 0) {
74 if (used[n]) {
75 Reason r = (Reason) reasons.get(n);
76 if (r instanceof ModusPonensBo) {
77 final ModusPonensBo mp = (ModusPonensBo) reasons.get(n);
78 used[mp.getN1()] = true;
79 used[mp.getN2()] = true;
80 } else if (r instanceof SubstPredBo) {
81 final SubstPredBo substPred = (SubstPredBo) reasons.get(n);
82 used[substPred.getN()] = true;
83 } else if (r instanceof Add) {
84
85 } else {
86 throw new IllegalStateException("unexpected reason class: " + r.getClass());
87 }
88 }
89 n--;
90 }
91 for (int j = 0; j < lines.size(); j++) {
92 if (used[j]) {
93 log.logMessageState(getUtf8Line(lines, reasons, j, trans));
94 }
95 }
96 new2Old = new ArrayList();
97 for (int j = 0; j < lines.size(); j++) {
98 if (used[j]) {
99 new2Old.add(new Integer(j));
100 }
101 }
102 final FormalProofLineListVo result = new FormalProofLineListVo();
103 for (int j = 0; j < new2Old.size(); j++) {
104 n = ((Integer) new2Old.get(j)).intValue();
105 final Reason r = (Reason) reasons.get(n);
106 final Reason newReason;
107 if (r instanceof ModusPonensBo) {
108 final ModusPonensBo mp = (ModusPonensBo) reasons.get(n);
109 newReason = new ModusPonensVo("" + (1 + old2new(mp.getN1())),
110 "" + (1 + old2new(mp.getN2())));
111 } else if (r instanceof SubstPredBo) {
112 final SubstPredBo substPred = (SubstPredBo) reasons.get(n);
113 newReason = new SubstPredVo("" + (1 + old2new(substPred.getN())),
114 substPred.getPredicateVariable(), substPred.getSubstituteFormula());
115 } else if (r instanceof Add) {
116 final Add add = (Add) reasons.get(n);
117 newReason = new AddVo(add.getReference());
118 } else {
119 throw new IllegalStateException("unexpected reason class: " + r.getClass());
120 }
121 result.add(new FormalProofLineVo("" + (1 + j),
122 new FormulaVo((Element) lines.get(new2old(j))),
123 newReason));
124 }
125 for (int j = 0; j < result.size(); j++) {
126 log.logMessageState(result.get(j).getLabel() + ": "
127 + trans.getUtf8(result.get(j).getFormula().getElement())
128 + " " + result.get(j).getReason());
129 }
130 return result;
131 }
132
133 private int old2new(final int old) {
134 int result = new2Old.indexOf(new Integer(old));
135 if (result < 0) {
136 throw new IllegalArgumentException("not found: " + old);
137 }
138 return result;
139 }
140
141 private int new2old(final int n) {
142 final int result = ((Integer) new2Old.get(n)).intValue();
143 return result;
144 }
145
146
147
148
149
150
151
152
153
154
155 public static String getUtf8Line(final List lines, final List reasons, final int i,
156 final Element2Utf8 trans) {
157 if (i < 0) {
158 return "beginning to prove";
159 }
160 final StringBuffer result = new StringBuffer();
161 result.append((i + 1) + ": ");
162 Reason reason = (Reason) reasons.get(i);
163 Element formula = (Element) lines.get(i);
164 return getUtf8Line(formula, reason, i, trans);
165 }
166
167
168
169
170
171
172
173
174
175
176 public static String getUtf8Line(final Element formula, final Reason reason, final int i,
177 final Element2Utf8 trans) {
178 final StringBuffer result = new StringBuffer();
179 result.append((i + 1) + ": ");
180 result.append(trans.getUtf8(formula));
181 result.append(" : ");
182 if (reason instanceof SubstPred) {
183 SubstPred s = (SubstPred) reason;
184 result.append("Subst " + s.getReference() + " ");
185 result.append(trans.getUtf8(s.getPredicateVariable()));
186 result.append(" by ");
187 result.append(trans.getUtf8(s.getSubstituteFormula()));
188 } else {
189 result.append(reason);
190 }
191 return result.toString();
192 }
193
194 }