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.List;
20  
21  import org.qedeq.base.utility.Enumerator;
22  
23  
24  /**
25   * Interpret function variables.
26   *
27   * @author  Michael Meyling
28   */
29  public final class FunctionVariableInterpreter {
30  
31      /** Model contains entities, functions, predicates. */
32      private Model model;
33  
34      /** List of function variables. */
35      private List functionVariables;
36  
37      /** List of counters for function variables. */
38      private List functionVariableCounters;
39  
40      /**
41       * Constructor.
42       *
43       * @param   model   Model we work on.
44       */
45      public FunctionVariableInterpreter(final Model model) {
46          this.model = model;
47          functionVariables = new ArrayList();
48          functionVariableCounters = new ArrayList();
49      }
50  
51      /**
52       * Get selection for function of model for given function variable.
53       *
54       * @param   var Function variable we want an interpretation for.
55       * @return  Function selection number of model.
56       */
57      private int getFunctionVariableSelection(final FunctionVariable var) {
58          int selection;
59          if (functionVariables.contains(var)) {
60              final int index = functionVariables.indexOf(var);
61              selection = ((Enumerator) functionVariableCounters.get(index)).getNumber();
62          } else {
63  //            System.out.println("added function variable " + var);
64              selection = 0;
65              functionVariables.add(var);
66              functionVariableCounters.add(new Enumerator());
67          }
68          return selection;
69      }
70  
71      /**
72       * Get interpretation for function of model for given function variable.
73       *
74       * @param   var Function variable we want an interpretation for.
75       * @return  Function.
76       */
77      public Function getFunction(final FunctionVariable var) {
78          return model.getFunction(var.getArgumentNumber(),
79              getFunctionVariableSelection(var));
80      }
81  
82      /**
83       * Change to next valuation.
84       *
85       * @return  Is there a next new valuation?
86       */
87      public boolean next() {
88          boolean next = true;
89          for (int i = functionVariables.size() - 1; i >= -1; i--) {
90              if (i < 0) {
91                  next = false;
92                  break;
93              }
94              final FunctionVariable var = (FunctionVariable) functionVariables.get(i);
95              final Enumerator number = (Enumerator) functionVariableCounters.get(i);
96              if (number.getNumber() + 1 < model.getFunctionSize(var.getArgumentNumber())) {
97                  number.increaseNumber();
98                  break;
99              }
100             number.reset();
101         }
102         return next;
103     }
104 
105     public String toString() {
106         final StringBuffer buffer = new StringBuffer();
107         buffer.append("function variables {");
108         for (int i = 0; i < functionVariables.size(); i++) {
109             if (i > 0) {
110                 buffer.append(", ");
111             }
112             FunctionVariable var = (FunctionVariable) functionVariables.get(i);
113             buffer.append(functionVariables.get(i));
114             buffer.append("=");
115             buffer.append(getFunction(var));
116         }
117         buffer.append("}");
118         return buffer.toString();
119     }
120 
121     /**
122      * Clear variable interpretation.
123      */
124     public void clear() {
125         functionVariables.clear();
126         functionVariableCounters.clear();
127     }
128 
129 }