1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.qedeq.kernel.bo.logic.common;
17
18 import org.qedeq.base.utility.Enumerator;
19 import org.qedeq.base.utility.EqualsUtility;
20 import org.qedeq.kernel.se.base.list.Atom;
21 import org.qedeq.kernel.se.base.list.Element;
22 import org.qedeq.kernel.se.base.list.ElementList;
23 import org.qedeq.kernel.se.dto.list.DefaultAtom;
24 import org.qedeq.kernel.se.dto.list.DefaultElementList;
25 import org.qedeq.kernel.se.dto.list.ElementSet;
26
27
28
29
30
31
32
33 public final class FormulaUtility implements Operators {
34
35
36
37
38
39 private FormulaUtility() {
40
41 }
42
43
44
45
46
47
48
49 public static final boolean isSubjectVariable(final Element element) {
50 if (element == null || !element.isList() || element.getList() == null) {
51 return false;
52 }
53 final ElementList list = element.getList();
54 if (list.getOperator().equals(SUBJECT_VARIABLE)) {
55 if (list.size() != 1) {
56 return false;
57 }
58 final Element first = element.getList().getElement(0);
59 if (first == null || !first.isAtom() || first.getAtom() == null) {
60 return false;
61 }
62 final Atom atom = first.getAtom();
63 if (atom.getString() == null || atom.getAtom().getString() == null
64 || atom.getString().length() == 0) {
65 return false;
66 }
67 } else {
68 return false;
69 }
70 return true;
71 }
72
73
74
75
76
77
78
79 public static final boolean isPredicateVariable(final Element element) {
80 return isOperator(PREDICATE_VARIABLE, element);
81 }
82
83
84
85
86
87
88
89 public static final boolean isPropositionVariable(final Element element) {
90 return isOperator(PREDICATE_VARIABLE, element) && element.getList().size() <= 1;
91 }
92
93
94
95
96
97
98
99 public static final boolean isFunctionVariable(final Element element) {
100 return isOperator(FUNCTION_VARIABLE, element);
101 }
102
103
104
105
106
107
108
109 public static final boolean isPredicateConstant(final Element element) {
110 return isOperator(PREDICATE_CONSTANT, element);
111 }
112
113
114
115
116
117
118
119 public static final boolean isFunctionConstant(final Element element) {
120 return isOperator(FUNCTION_CONSTANT, element);
121 }
122
123
124
125
126
127
128
129
130
131 public static boolean isOperator(final String operator,
132 final Element element) {
133 return isOperator(operator, element, 0);
134 }
135
136
137
138
139
140
141
142
143
144
145 private static boolean isOperator(final String operator,
146 final Element element, final int minArguments) {
147 if (element == null || !element.isList() || element.getList() == null) {
148 return false;
149 }
150 final ElementList list = element.getList();
151 if (list.getOperator().equals(operator)) {
152 if (list.size() < 1 + minArguments) {
153 return false;
154 }
155 final Element first = element.getList().getElement(0);
156 if (first == null || !first.isAtom() || first.getAtom() == null) {
157 return false;
158 }
159 final Atom atom = first.getAtom();
160 if (atom.getString() == null || atom.getAtom().getString() == null
161 || atom.getString().length() == 0) {
162 return false;
163 }
164 } else {
165 return false;
166 }
167 return true;
168 }
169
170
171
172
173
174
175
176 public static final ElementSet getFreeSubjectVariables(final Element element) {
177 final ElementSet free = new ElementSet();
178 if (isSubjectVariable(element)) {
179 free.add(element);
180 } else if (element.isList()) {
181 final ElementList list = element.getList();
182 if (isBindingOperator(list)) {
183 for (int i = 1; i < list.size(); i++) {
184 free.union(getFreeSubjectVariables(list.getElement(i)));
185 }
186 free.remove(list.getElement(0));
187 } else {
188 for (int i = 0; i < list.size(); i++) {
189 free.union(getFreeSubjectVariables(list.getElement(i)));
190 }
191 }
192 }
193 return free;
194 }
195
196
197
198
199
200
201
202 public static final ElementSet getBoundSubjectVariables(final Element element) {
203 final ElementSet bound = new ElementSet();
204 if (element.isList()) {
205 ElementList list = element.getList();
206
207 if (isBindingOperator(list)) {
208
209 bound.add(list.getElement(0));
210
211 for (int i = 1; i < list.size(); i++) {
212 bound.union(getBoundSubjectVariables(
213 list.getElement(i)));
214 }
215 } else {
216
217 for (int i = 0; i < list.size(); i++) {
218 bound.union(getBoundSubjectVariables(list.getElement(i)));
219 }
220 }
221 }
222 return bound;
223 }
224
225
226
227
228
229
230
231 public static final ElementSet getSubjectVariables(final Element element) {
232 final ElementSet all = new ElementSet();
233 if (isSubjectVariable(element)) {
234 all.add(element);
235 } else if (element.isList()) {
236 final ElementList list = element.getList();
237 for (int i = 1; i < list.size(); i++) {
238 all.union(getSubjectVariables(list.getElement(i)));
239 }
240 }
241 return all;
242 }
243
244
245
246
247
248
249
250
251 public static final ElementSet getPredicateVariables(final Element element) {
252 final ElementSet all = new ElementSet();
253 if (isPredicateVariable(element)) {
254 final ElementList pred = element.getList();
255 final DefaultElementList normalized = new DefaultElementList(pred.getOperator());
256 normalized.add(pred.getElement(0));
257 for (int i = 1; i < pred.size(); i++) {
258 normalized.add(createSubjectVariable("x_" + i));
259 }
260 all.add(normalized);
261 } else if (element.isList()) {
262 final ElementList list = element.getList();
263 for (int i = 0; i < list.size(); i++) {
264 all.union(getPredicateVariables(list.getElement(i)));
265 }
266 }
267 return all;
268 }
269
270
271
272
273
274
275
276
277 public static final ElementSet getPropositionVariables(final Element element) {
278 final ElementSet all = new ElementSet();
279 if (isPropositionVariable(element)) {
280 all.add(element);
281 } else if (element.isList()) {
282 final ElementList list = element.getList();
283 for (int i = 0; i < list.size(); i++) {
284 all.union(getPropositionVariables(list.getElement(i)));
285 }
286 }
287 return all;
288 }
289
290
291
292
293
294
295
296 public static final ElementSet getPartFormulas(final Element element) {
297 final ElementSet all = new ElementSet();
298 if (element == null || element.isAtom()) {
299 return all;
300 }
301 final ElementList list = element.getList();
302 if (isPredicateVariable(list)) {
303 all.add(element);
304 } else if (isPredicateConstant(list)) {
305 all.add(list);
306 } else if (Operators.CONJUNCTION_OPERATOR.equals(list.getOperator())
307 || Operators.DISJUNCTION_OPERATOR.equals(list.getOperator())
308 || Operators.NEGATION_OPERATOR.equals(list.getOperator())
309 || Operators.IMPLICATION_OPERATOR.equals(list.getOperator())
310 || Operators.EQUIVALENCE_OPERATOR.equals(list.getOperator())
311 ) {
312 all.add(list);
313 for (int i = 0; i < list.size(); i++) {
314 all.union(getPartFormulas(list.getElement(i)));
315 }
316 } else if (isBindingOperator(list)) {
317 all.add(list);
318 for (int i = 0; i < list.size(); i++) {
319 all.union(getPartFormulas(list.getElement(i)));
320 }
321 } else if (isSubjectVariable(list)) {
322
323 } else if (isFunctionVariable(list)) {
324
325 } else if (isFunctionConstant(list)) {
326
327 } else {
328 for (int i = 0; i < list.size(); i++) {
329 all.union(getPartFormulas(list.getElement(i)));
330 }
331 }
332 return all;
333 }
334
335
336
337
338
339
340
341 public static boolean isBindingOperator(final ElementList list) {
342 final String operator = list.getOperator();
343 if (operator == null || list.size() <= 0 || !isSubjectVariable(list.getElement(0))) {
344 return false;
345 }
346 return operator.equals(EXISTENTIAL_QUANTIFIER_OPERATOR)
347 || operator.equals(UNIQUE_EXISTENTIAL_QUANTIFIER_OPERATOR)
348 || operator.equals(UNIVERSAL_QUANTIFIER_OPERATOR)
349 || operator.equals(CLASS_OP);
350 }
351
352
353
354
355
356
357
358
359 public static String getDifferenceLocation(final Element first, final Element second) {
360 final StringBuffer diff = new StringBuffer();
361 equal(diff, first, second);
362 return diff.toString();
363 }
364
365
366
367
368
369
370
371
372
373
374 private static boolean equal(final StringBuffer firstContext,
375 final Element first, final Element second) {
376 if (first == null) {
377 return second == null;
378 }
379 if (second == null) {
380 return false;
381 }
382 if (first.isAtom()) {
383 if (!second.isAtom()) {
384 return false;
385 }
386 return EqualsUtility.equals(first.getAtom().getString(), second.getAtom().getString());
387 }
388 if (second.isAtom()) {
389 return false;
390 }
391 if (!EqualsUtility.equals(first.getList().getOperator(), second.getList().getOperator())) {
392 return false;
393 }
394 if (first.getList().size() != second.getList().size()) {
395 return false;
396 }
397 for (int i = 0; i < first.getList().size(); i++) {
398 final int length = firstContext.length();
399 firstContext.append(".getList().getElement(" + i + ")");
400 if (!equal(firstContext, first.getList().getElement(i),
401 second.getList().getElement(i))) {
402 return false;
403 }
404 firstContext.setLength(length);
405 }
406 return true;
407 }
408
409
410
411
412
413
414
415
416
417
418
419
420
421 public static Element replaceSubjectVariableQuantifier(final Element originalSubjectVariable,
422 final Element replacementSubjectVariable, final Element formulaElement,
423 final int occurrenceGoal, final Enumerator occurreneCurrent) {
424 if (formulaElement.isAtom()) {
425 return formulaElement;
426 }
427 final ElementList formula = formulaElement.getList();
428 if (occurreneCurrent.getNumber() > occurrenceGoal) {
429 return formula.copy();
430 }
431 final ElementList result = new DefaultElementList(formula.getOperator());
432 if (isBindingOperator(formula)
433 && formula.getElement(0).equals(originalSubjectVariable)) {
434 occurreneCurrent.increaseNumber();
435
436 if (occurrenceGoal == occurreneCurrent.getNumber()) {
437
438 return formula.replace(originalSubjectVariable,
439 replacementSubjectVariable);
440 }
441 }
442 for (int i = 0; i < formula.size(); i++) {
443 result.add(replaceSubjectVariableQuantifier(originalSubjectVariable,
444 replacementSubjectVariable, formula.getElement(i), occurrenceGoal,
445 occurreneCurrent));
446 }
447 return result;
448 }
449
450
451
452
453
454
455
456
457
458
459
460
461
462 public static Element replaceOperatorVariable(final Element formula,
463 final Element operatorVariable, final Element replacement) {
464 if (formula == null || operatorVariable == null || replacement == null
465 || formula.isAtom() || operatorVariable.isAtom() || replacement.isAtom()) {
466 return formula;
467 }
468 final ElementList f = formula.getList();
469 final ElementList ov = operatorVariable.getList();
470 final ElementList r = replacement.getList();
471
472
473 if (f.size() < 1 || ov.size() < 1) {
474
475 return formula;
476 }
477
478 Element rn = r;
479 for (int i = 1; i < ov.size(); i++) {
480 rn = rn.replace(ov.getElement(i), createMeta(ov.getElement(i)));
481 }
482 return replaceOperatorVariableMeta(formula, operatorVariable, rn);
483 }
484
485
486
487
488
489
490
491
492
493
494
495
496
497 private static Element replaceOperatorVariableMeta(final Element formula,
498 final Element operatorVariable, final Element replacement) {
499 if (formula.isAtom() || operatorVariable.isAtom() || replacement.isAtom()) {
500 return formula;
501 }
502 final ElementList f = formula.getList();
503 final ElementList ov = operatorVariable.getList();
504 final ElementList r = replacement.getList();
505 if (f.size() < 1 || ov.size() < 1) {
506 return formula.copy();
507 }
508 ElementList result;
509 if (EqualsUtility.equals(f.getOperator(), ov.getOperator()) && f.size() == ov.size()
510 && f.getElement(0).equals(ov.getElement(0))) {
511
512 result = r;
513 for (int i = 1; i < ov.size(); i++) {
514 result = (ElementList) result.replace(createMeta(ov.getElement(i)),
515 replaceOperatorVariableMeta(f.getElement(i), operatorVariable, replacement));
516 }
517 } else {
518 result = new DefaultElementList(f.getOperator());
519 for (int i = 0; i < f.size(); i++) {
520 result.add(replaceOperatorVariableMeta(f.getElement(i), operatorVariable,
521 replacement));
522 }
523 }
524 return result;
525 }
526
527
528
529
530
531
532
533
534
535
536 public static boolean containsOperatorVariable(final Element formula,
537 final Element operatorVariable) {
538 if (formula == null || formula.isAtom() || operatorVariable == null
539 || operatorVariable.isAtom()) {
540 return false;
541 }
542 final ElementList f = formula.getList();
543 final ElementList ov = operatorVariable.getList();
544 if (f.size() < 1 || ov.size() < 1) {
545 return f.equals(ov);
546 }
547 if (EqualsUtility.equals(f.getOperator(), ov.getOperator()) && f.size() == ov.size()
548 && f.getElement(0).equals(ov.getElement(0))) {
549 return true;
550 }
551 for (int i = 0; i < f.size(); i++) {
552 if (containsOperatorVariable(f.getElement(i), operatorVariable)) {
553 return true;
554 }
555 }
556 return false;
557 }
558
559
560
561
562
563
564
565
566
567
568
569 public static boolean testOperatorVariable(final Element formula,
570 final Element operatorVariable, final ElementSet bound) {
571 if (formula.isAtom() || operatorVariable.isAtom()) {
572 return true;
573 }
574 final ElementList f = formula.getList();
575 final ElementList ov = operatorVariable.getList();
576 if (f.size() < 1 || ov.size() < 1) {
577 return true;
578 }
579 boolean ok = true;
580 if (EqualsUtility.equals(f.getOperator(), ov.getOperator()) && f.size() == ov.size()
581 && f.getElement(0).equals(ov.getElement(0))) {
582 if (!getSubjectVariables(f).intersection(bound).isEmpty()) {
583 return false;
584 }
585 } else {
586 for (int i = 0; ok && i < f.size(); i++) {
587 ok = testOperatorVariable(f.getElement(i), operatorVariable, bound);
588 }
589 }
590 return ok;
591 }
592
593
594
595
596
597
598
599 public static boolean isImplication(final Element formula) {
600 if (formula.isAtom()) {
601 return false;
602 }
603 final ElementList f = formula.getList();
604 return Operators.IMPLICATION_OPERATOR.equals(f.getList().getOperator())
605 && f.getList().size() == 2;
606 }
607
608
609
610
611
612
613
614
615 public static Element createMeta(final Element subjectVariable) {
616 if (!isSubjectVariable(subjectVariable)) {
617 return subjectVariable;
618 }
619 final DefaultElementList result = new DefaultElementList(META_VARIABLE);
620 result.add(subjectVariable.getList().getElement(0));
621 return result;
622 }
623
624
625
626
627
628
629
630 public static Element createSubjectVariable(final String subjectVariableName) {
631 final DefaultElementList result = new DefaultElementList(SUBJECT_VARIABLE);
632 result.add(new DefaultAtom(subjectVariableName));
633 return result;
634 }
635
636
637
638
639
640
641
642 public static Element createPredicateVariable(final String predicateVariableName) {
643 final DefaultElementList result = new DefaultElementList(PREDICATE_VARIABLE);
644 result.add(new DefaultAtom(predicateVariableName));
645 return result;
646 }
647
648 }