public static void inferTypesFromPropositions(Proposition proposition, KeyValueList table, Cons visiblevars) {
    { Vector arguments = proposition.arguments;

      { Keyword testValue000 = proposition.kind;

        if (testValue000 == Logic.KWD_AND) {
          { Stella_Object arg = null;
            Vector vector000 = arguments;
            int index000 = 0;
            int length000 = vector000.length();

            for (;index000 < length000; index000 = index000 + 1) {
              arg = (vector000.theArray)[index000];
              Proposition.inferTypesFromPropositions(((Proposition)(arg)), table, visiblevars);
            }
          }
        }
        else if (testValue000 == Logic.KWD_OR) {
          { Stella_Object arg = null;
            Vector vector001 = arguments;
            int index001 = 0;
            int length001 = vector001.length();

            for (;index001 < length001; index001 = index001 + 1) {
              arg = (vector001.theArray)[index001];
              Proposition.inferTypesFromPropositions(((Proposition)(arg)), table, Stella.NIL);
            }
          }
        }
        else if ((testValue000 == Logic.KWD_ISA) ||
            ((testValue000 == Logic.KWD_PREDICATE) ||
             ((testValue000 == Logic.KWD_FUNCTION) ||
              (testValue000 == Logic.KWD_EQUIVALENT)))) {
          Proposition.inferTypesFromOneProposition(proposition, table, visiblevars);
        }
        else if (testValue000 == Logic.KWD_FORALL) {
          visiblevars = Stella.NIL;
          { PatternVariable v = null;
            Vector vector002 = ((Vector)(KeyValueList.dynamicSlotValue(proposition.dynamicSlots, Logic.SYM_LOGIC_IO_VARIABLES, null)));
            int index002 = 0;
            int length002 = vector002.length();

            for (;index002 < length002; index002 = index002 + 1) {
              v = ((PatternVariable)((vector002.theArray)[index002]));
              visiblevars = Cons.cons(v, visiblevars);
            }
          }
          Proposition.inferTypesFromPropositions(((Proposition)((arguments.theArray)[0])), table, visiblevars);
          Proposition.inferTypesFromPropositions(((Proposition)((arguments.theArray)[1])), table, visiblevars);
        }
        else if (testValue000 == Logic.KWD_EXISTS) {
          { PatternVariable v = null;
            Vector vector003 = ((Vector)(KeyValueList.dynamicSlotValue(proposition.dynamicSlots, Logic.SYM_LOGIC_IO_VARIABLES, null)));
            int index003 = 0;
            int length003 = vector003.length();

            for (;index003 < length003; index003 = index003 + 1) {
              v = ((PatternVariable)((vector003.theArray)[index003]));
              visiblevars = Cons.cons(v, visiblevars);
            }
          }
          Proposition.inferTypesFromPropositions(((Proposition)((arguments.theArray)[0])), table, visiblevars);
        }
        else {
        }
      }
    }
  }