
# recurrence equations for permutations:  perms(M) means  M!
"""{ def perms(0) == 1
     def perms(n) == perms(n-1) * n  }"""

def fac(n) :
    """{ pre  n >= 0
         post  ans == perms(n)
         return ans  }"""
    if n == 0 :
        ans = 1
        """{ 1. perms(0) == 1    def
             5. ans == 1         premise
             2. ans == perms(0)  algebra  1 5
             3. n == 0           premise
             4. ans == perms(n)  subst 3 2}"""
    else :
        """{ 1. not(n == 0)   premise
             2. n >= 0        premise
             3. n - 1 >= 0    algebra 1 2
        }"""
        sub = fac(n-1)
        """{ 1.  sub == perms(n-1)    premise }"""
        ans = sub * n
        """{ 1.  ans == sub * n              premise
             2.  sub == perms(n-1)           premise
             3.  ans == perms(n-1) * n       subst 2 1
             4.  perms(n) == perms(n-1) * n   def
             5.  ans == perms(n)             algebra 4 3
        }"""
    """{ 1.  ans == perms(n)                 premise }"""
    return ans

