View Javadoc

1   /* This file is part of the project "Hilbert II" - http://www.qedeq.org" target="alexandria_uri">http://www.qedeq.org
2    *
3    * Copyright 2000-2014,  Michael Meyling <mime@qedeq.org>.
4    *
5    * "Hilbert II" is free software; you can redistribute
6    * it and/or modify it under the terms of the GNU General Public
7    * License as published by the Free Software Foundation; either
8    * version 2 of the License, or (at your option) any later version.
9    *
10   * This program is distributed in the hope that it will be useful,
11   * but WITHOUT ANY WARRANTY; without even the implied warranty of
12   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13   * GNU General Public License for more details.
14   */
15  
16  package org.qedeq.kernel.bo.logic.model;
17  
18  import java.util.ArrayList;
19  import java.util.HashMap;
20  import java.util.List;
21  import java.util.Map;
22  import java.util.Vector;
23  
24  /**
25   * A model for our mathematical world. It has entities, functions and predicates.
26   * There are also predicate and function constants.
27   *
28   * @author  Michael Meyling
29   */
30  public abstract class DynamicModel implements Model {
31  
32      /** Always return false. */
33      public static final Predicate FALSE = new Predicate(0, 99, "F", "always false") {
34          public boolean calculate(final Entity[] entities) {
35              return false;
36          }
37      };
38  
39      /** Always return true. */
40      public static final Predicate TRUE = new Predicate(0, 99, "T", "always true") {
41          public boolean calculate(final Entity[] entities) {
42              return true;
43          }
44      };
45  
46      /** Return true if value is even. */
47      public static final Predicate EVEN = new Predicate(0, 99, "| 2", "is even") {
48          public boolean calculate(final Entity[] entities) {
49              boolean result = true;
50              for (int i = 0; i < entities.length; i++) {
51                  result &= entities[i].getValue() % 2 == 0;
52              }
53              return result;
54          }
55      };
56  
57      /** Are the entities ordered by < ? */
58      public static final Predicate LESS = new Predicate(0, 99, "<", "less") {
59          public boolean calculate(final Entity[] entities) {
60              boolean result = true;
61              for (int i = 0; i < entities.length - 1; i++) {
62                  result &= entities[i].getValue() < entities[i + 1].getValue();
63              }
64              return result;
65          }
66      };
67  
68      /** Are the entities not ordered by < ? */
69      public static final Predicate NOT_LESS = Predicate.not(LESS);
70  
71      /** Are the entities are all the same? */
72      public static final Predicate EQUAL = new Predicate(0, 99, "=", "equal") {
73          public boolean calculate(final Entity[] entities) {
74              boolean result = true;
75              for (int i = 0; i < entities.length - 1; i++) {
76                  result &= entities[i].getValue() == entities[i + 1].getValue();
77              }
78              return result;
79          }
80      };
81  
82      /** Are the entities are not all the same? */
83      public static final Predicate NOT_EQUAL = Predicate.not(EQUAL);
84  
85      /** Name of model. */
86      private final String name;
87  
88      /** List of all entities in this model. */
89      private final List entities;
90  
91      /** List of functions for different argument numbers. */
92      private final Vector functionPool;
93  
94      /** List of predicates for different argument numbers. */
95      private final Vector predicatePool;
96  
97      /** Map of predicate constants. */
98      private final Map predicateConstants;
99  
100     /** Map of function constants. */
101     private final Map functionConstants;
102 
103     /**
104      * Constructor.
105      *
106      * @param   name    Model name.
107      */
108     public DynamicModel(final String name) {
109         this.name = name;
110         entities = new ArrayList();
111         functionPool = new Vector();
112         predicatePool = new Vector();
113 
114         predicateConstants = new HashMap();
115         predicateConstants.put(new ModelPredicateConstant("TRUE", 0), TRUE);
116         predicateConstants.put(new ModelPredicateConstant("FALSE", 0), FALSE);
117         predicateConstants.put(new ModelPredicateConstant("equal", 2), EQUAL);
118         predicateConstants.put(new ModelPredicateConstant("notEqual", 2), NOT_EQUAL);
119         functionConstants = new HashMap();
120     }
121 
122     /**
123      * Get model name.
124      *
125      * @return  Model name.
126      */
127     public String getName() {
128         return name;
129     }
130 
131     /**
132      * Returns the description for the concrete model.
133      *
134      * @return  Description of concrete model.
135      */
136     public abstract String getDescription();
137 
138     /**
139      * Add a predicate constant.
140      *
141      * @param   constant    Add for this constant.
142      * @param   predicate   This interpretation.
143      */
144     public void addPredicateConstant(final ModelPredicateConstant constant, final Predicate predicate) {
145         predicateConstants.put(constant, predicate);
146     }
147 
148     /**
149      * Add a function constant.
150      *
151      * @param   constant    Add for this constant.
152      * @param   function    This interpretation.
153      */
154     public void addFunctionConstant(final ModelFunctionConstant constant, final Function function) {
155         functionConstants.put(constant, function);
156     }
157 
158     protected void addEntity(final Entity entity) {
159         if (entities.size() != entity.getValue()) {
160             throw new RuntimeException("entity value should have been " + entities.size()
161                 + " but was " + entity.getValue());
162         }
163 //        System.out.println("added entity " + entity);
164         entities.add(entity);
165     }
166 
167     public int getEntitiesSize() {
168         return entities.size();
169     }
170 
171     public Entity getEntity(final int number) {
172         return (Entity) entities.get(number);
173     }
174 
175     public int getPredicateSize(final int size) {
176         if (predicatePool.size() <=  size) {
177             return 0;
178         }
179         final List list = (List) predicatePool.get(size);
180         if (list == null) {
181             return 0;
182         }
183         return list.size();
184     }
185 
186     public Predicate getPredicate(final int size, final int number) {
187         final List predicateForSize = (List) predicatePool.get(size);
188         return (Predicate) predicateForSize.get(number);
189     }
190 
191     /**
192      * Add a predicate for interpreting predicate variables.
193      *
194      * @param   size        Add for this function argument number.
195      * @param   predicate   This interpretation.
196      */
197     public void addPredicate(final int size, final Predicate predicate) {
198         if (getPredicateSize(size) == 0) {
199             if (predicatePool.size() <= size) {
200                 for (int i = predicatePool.size(); i <= size; i++) {
201                     predicatePool.add(new ArrayList());
202                 }
203             }
204         }
205         List list = (List) predicatePool.get(size);
206         list.add(predicate);
207     }
208 
209     public Predicate getPredicateConstant(final ModelPredicateConstant con) {
210         return (Predicate) predicateConstants.get(con);
211     }
212 
213     public int getFunctionSize(final int size) {
214         if (functionPool.size() <=  size) {
215             return 0;
216         }
217         final List list = (List) functionPool.get(size);
218         if (list == null) {
219             return 0;
220         }
221         return list.size();
222     }
223 
224     public Function getFunction(final int size, final int number) {
225         final List functionForSize = (List) functionPool.get(size);
226         return (Function) functionForSize.get(number);
227     }
228 
229     /**
230      * Add a function for interpreting function variables.
231      *
232      * @param   size        Add for this function argument number.
233      * @param   function    This interpretation.
234      */
235     public void addFunction(final int size, final Function function) {
236         if (getFunctionSize(size) == 0) {
237             if (functionPool.size() <= size) {
238                 for (int i = functionPool.size(); i <= size; i++) {
239                     functionPool.add(new ArrayList());
240                 }
241             }
242         }
243         final List list = (List) functionPool.get(size);
244         list.add(function);
245     }
246 
247     public Function getFunctionConstant(final ModelFunctionConstant con) {
248         return (Function) functionConstants.get(con);
249     }
250 
251     public abstract Entity comprehension(final Entity[] array);
252 
253 }