0 JBC
↳1 JBC2FIG (⇒)
↳2 JBCTerminationGraph
↳3 FIGtoITRSProof (⇒)
↳4 IDP
↳5 IDPNonInfProof (⇒)
↳6 AND
↳7 IDP
↳8 IDependencyGraphProof (⇔)
↳9 TRUE
↳10 IDP
↳11 IDependencyGraphProof (⇔)
↳12 TRUE
public class TerminatorRec02 {
public static void main(String[] args) {
fact(args.length);
}
public static int fact(int x) {
if (x > 1) {
int y = fact(x - 1);
return y * x;
}
return 1;
}
}
Generated 10 rules for P and 16 rules for R.
Combined rules. Obtained 1 rules for P and 2 rules for R.
Filtered ground terms:
26_0_fact_ConstantStackPush(x1, x2, x3) → 26_0_fact_ConstantStackPush(x2, x3)
Cond_26_0_fact_ConstantStackPush(x1, x2, x3, x4) → Cond_26_0_fact_ConstantStackPush(x1, x3, x4)
75_0_fact_Return(x1) → 75_0_fact_Return
Cond_57_1_fact_InvokeMethod1(x1, x2, x3, x4) → Cond_57_1_fact_InvokeMethod1(x1, x3, x4)
Cond_57_1_fact_InvokeMethod(x1, x2, x3, x4) → Cond_57_1_fact_InvokeMethod(x1, x3)
37_0_fact_Return(x1, x2) → 37_0_fact_Return
Filtered duplicate args:
26_0_fact_ConstantStackPush(x1, x2) → 26_0_fact_ConstantStackPush(x2)
Cond_26_0_fact_ConstantStackPush(x1, x2, x3) → Cond_26_0_fact_ConstantStackPush(x1, x3)
Filtered unneeded arguments:
Cond_57_1_fact_InvokeMethod(x1, x2) → Cond_57_1_fact_InvokeMethod(x1)
Cond_57_1_fact_InvokeMethod1(x1, x2, x3) → Cond_57_1_fact_InvokeMethod1(x1)
Combined rules. Obtained 1 rules for P and 2 rules for R.
Finished conversion. Obtained 1 rules for P and 2 rules for R. System has predefined symbols.
| != | ~ | Neq: (Integer, Integer) -> Boolean |
| * | ~ | Mul: (Integer, Integer) -> Integer |
| >= | ~ | Ge: (Integer, Integer) -> Boolean |
| -1 | ~ | UnaryMinus: (Integer) -> Integer |
| | | ~ | Bwor: (Integer, Integer) -> Integer |
| / | ~ | Div: (Integer, Integer) -> Integer |
| = | ~ | Eq: (Integer, Integer) -> Boolean |
| ~ | Bwxor: (Integer, Integer) -> Integer | |
| || | ~ | Lor: (Boolean, Boolean) -> Boolean |
| ! | ~ | Lnot: (Boolean) -> Boolean |
| < | ~ | Lt: (Integer, Integer) -> Boolean |
| - | ~ | Sub: (Integer, Integer) -> Integer |
| <= | ~ | Le: (Integer, Integer) -> Boolean |
| > | ~ | Gt: (Integer, Integer) -> Boolean |
| ~ | ~ | Bwnot: (Integer) -> Integer |
| % | ~ | Mod: (Integer, Integer) -> Integer |
| & | ~ | Bwand: (Integer, Integer) -> Integer |
| + | ~ | Add: (Integer, Integer) -> Integer |
| && | ~ | Land: (Boolean, Boolean) -> Boolean |
Integer
(0) -> (1), if ((x0[0] > 1 →* TRUE)∧(x0[0] →* x0[1]))
(1) -> (0), if ((x0[1] - 1 →* x0[0]))
(1) (>(x0[0], 1)=TRUE∧x0[0]=x0[1] ⇒ 26_0_FACT_CONSTANTSTACKPUSH(x0[0])≥NonInfC∧26_0_FACT_CONSTANTSTACKPUSH(x0[0])≥COND_26_0_FACT_CONSTANTSTACKPUSH(>(x0[0], 1), x0[0])∧(UIncreasing(COND_26_0_FACT_CONSTANTSTACKPUSH(>(x0[0], 1), x0[0])), ≥))
(2) (>(x0[0], 1)=TRUE ⇒ 26_0_FACT_CONSTANTSTACKPUSH(x0[0])≥NonInfC∧26_0_FACT_CONSTANTSTACKPUSH(x0[0])≥COND_26_0_FACT_CONSTANTSTACKPUSH(>(x0[0], 1), x0[0])∧(UIncreasing(COND_26_0_FACT_CONSTANTSTACKPUSH(>(x0[0], 1), x0[0])), ≥))
(3) (x0[0] + [-2] ≥ 0 ⇒ (UIncreasing(COND_26_0_FACT_CONSTANTSTACKPUSH(>(x0[0], 1), x0[0])), ≥)∧[(-1)Bound*bni_16] + [(2)bni_16]x0[0] ≥ 0∧[(-1)bso_17] ≥ 0)
(4) (x0[0] + [-2] ≥ 0 ⇒ (UIncreasing(COND_26_0_FACT_CONSTANTSTACKPUSH(>(x0[0], 1), x0[0])), ≥)∧[(-1)Bound*bni_16] + [(2)bni_16]x0[0] ≥ 0∧[(-1)bso_17] ≥ 0)
(5) (x0[0] + [-2] ≥ 0 ⇒ (UIncreasing(COND_26_0_FACT_CONSTANTSTACKPUSH(>(x0[0], 1), x0[0])), ≥)∧[(-1)Bound*bni_16] + [(2)bni_16]x0[0] ≥ 0∧[(-1)bso_17] ≥ 0)
(6) (x0[0] ≥ 0 ⇒ (UIncreasing(COND_26_0_FACT_CONSTANTSTACKPUSH(>(x0[0], 1), x0[0])), ≥)∧[(-1)Bound*bni_16 + (4)bni_16] + [(2)bni_16]x0[0] ≥ 0∧[(-1)bso_17] ≥ 0)
(7) (COND_26_0_FACT_CONSTANTSTACKPUSH(TRUE, x0[1])≥NonInfC∧COND_26_0_FACT_CONSTANTSTACKPUSH(TRUE, x0[1])≥26_0_FACT_CONSTANTSTACKPUSH(-(x0[1], 1))∧(UIncreasing(26_0_FACT_CONSTANTSTACKPUSH(-(x0[1], 1))), ≥))
(8) ((UIncreasing(26_0_FACT_CONSTANTSTACKPUSH(-(x0[1], 1))), ≥)∧[2 + (-1)bso_19] ≥ 0)
(9) ((UIncreasing(26_0_FACT_CONSTANTSTACKPUSH(-(x0[1], 1))), ≥)∧[2 + (-1)bso_19] ≥ 0)
(10) ((UIncreasing(26_0_FACT_CONSTANTSTACKPUSH(-(x0[1], 1))), ≥)∧[2 + (-1)bso_19] ≥ 0)
(11) ((UIncreasing(26_0_FACT_CONSTANTSTACKPUSH(-(x0[1], 1))), ≥)∧0 = 0∧[2 + (-1)bso_19] ≥ 0)
POL(TRUE) = 0
POL(FALSE) = 0
POL(57_1_fact_InvokeMethod(x1, x2, x3)) = [-1] + [-1]x2
POL(37_0_fact_Return) = [-1]
POL(1) = [1]
POL(Cond_57_1_fact_InvokeMethod(x1, x2, x3, x4)) = [-1] + [-1]x3
POL(>(x1, x2)) = [-1]
POL(75_0_fact_Return) = [-1]
POL(Cond_57_1_fact_InvokeMethod1(x1, x2, x3, x4)) = [-1] + [-1]x3
POL(26_0_FACT_CONSTANTSTACKPUSH(x1)) = [2]x1
POL(COND_26_0_FACT_CONSTANTSTACKPUSH(x1, x2)) = [2]x2
POL(-(x1, x2)) = x1 + [-1]x2
COND_26_0_FACT_CONSTANTSTACKPUSH(TRUE, x0[1]) → 26_0_FACT_CONSTANTSTACKPUSH(-(x0[1], 1))
26_0_FACT_CONSTANTSTACKPUSH(x0[0]) → COND_26_0_FACT_CONSTANTSTACKPUSH(>(x0[0], 1), x0[0])
26_0_FACT_CONSTANTSTACKPUSH(x0[0]) → COND_26_0_FACT_CONSTANTSTACKPUSH(>(x0[0], 1), x0[0])
| != | ~ | Neq: (Integer, Integer) -> Boolean |
| * | ~ | Mul: (Integer, Integer) -> Integer |
| >= | ~ | Ge: (Integer, Integer) -> Boolean |
| -1 | ~ | UnaryMinus: (Integer) -> Integer |
| | | ~ | Bwor: (Integer, Integer) -> Integer |
| / | ~ | Div: (Integer, Integer) -> Integer |
| = | ~ | Eq: (Integer, Integer) -> Boolean |
| ~ | Bwxor: (Integer, Integer) -> Integer | |
| || | ~ | Lor: (Boolean, Boolean) -> Boolean |
| ! | ~ | Lnot: (Boolean) -> Boolean |
| < | ~ | Lt: (Integer, Integer) -> Boolean |
| - | ~ | Sub: (Integer, Integer) -> Integer |
| <= | ~ | Le: (Integer, Integer) -> Boolean |
| > | ~ | Gt: (Integer, Integer) -> Boolean |
| ~ | ~ | Bwnot: (Integer) -> Integer |
| % | ~ | Mod: (Integer, Integer) -> Integer |
| & | ~ | Bwand: (Integer, Integer) -> Integer |
| + | ~ | Add: (Integer, Integer) -> Integer |
| && | ~ | Land: (Boolean, Boolean) -> Boolean |
Integer
| != | ~ | Neq: (Integer, Integer) -> Boolean |
| * | ~ | Mul: (Integer, Integer) -> Integer |
| >= | ~ | Ge: (Integer, Integer) -> Boolean |
| -1 | ~ | UnaryMinus: (Integer) -> Integer |
| | | ~ | Bwor: (Integer, Integer) -> Integer |
| / | ~ | Div: (Integer, Integer) -> Integer |
| = | ~ | Eq: (Integer, Integer) -> Boolean |
| ~ | Bwxor: (Integer, Integer) -> Integer | |
| || | ~ | Lor: (Boolean, Boolean) -> Boolean |
| ! | ~ | Lnot: (Boolean) -> Boolean |
| < | ~ | Lt: (Integer, Integer) -> Boolean |
| - | ~ | Sub: (Integer, Integer) -> Integer |
| <= | ~ | Le: (Integer, Integer) -> Boolean |
| > | ~ | Gt: (Integer, Integer) -> Boolean |
| ~ | ~ | Bwnot: (Integer) -> Integer |
| % | ~ | Mod: (Integer, Integer) -> Integer |
| & | ~ | Bwand: (Integer, Integer) -> Integer |
| + | ~ | Add: (Integer, Integer) -> Integer |
| && | ~ | Land: (Boolean, Boolean) -> Boolean |
Integer