Defining Primtive Recursion for multiplication in Isabelle
I am new to Isabelle and I am trying to define primitive recursive functions. I have tried out addition but I am having trouble with multiplication. datatype nati = Zero | Suc nati primrec add :: "nati ⇒ nati ⇒ nati" where "add Zero n = n" | "add (Suc m) n = Suc(add m n)" primrec mult :: "nati ⇒ nati ⇒ nati" where "mult Suc(Zero) n = n" | "mult (Suc m) n = add((mult m n) m)" I get the following error for the above code Type unification failed: Clash of types "_ ⇒ _" and "nati" Type error in application: operator not of function type Operator: mult m n :: nati Operand: m :: nati Any ideas?
The problem is your mult function: It should look like this: primrec mult :: "nati ⇒ nati ⇒ nati" where "mult Zero n = Zero" | "mult (Suc m) n = add (mult m n) m" Function application in functional programming/Lambda calculus is the operation that binds strongest and it associates to the left: something like f x y means ‘f applied to x, and the result applied to y’ – or, equivalently due to Currying: the function f applied to the parameters x and y. Therefore, something like mult Suc(Zero) n would be read as mult Suc Zero n, i.e. the function mult would have to be a function taking three parameters, namely Suc, Zero, and n. That gives you a type error. Similarly, add ((mult m n) m) does not work, since that is identical to add (mult m n m), which would mean that add is a function taking one parameter and mult is one taking three. Lastly, if you fix all that, you will get another error saying you have a non-primitive pattern on the left-hand side of your mult function. You cannot pattern-match on something like Suc Zero since it is not a primitive pattern. You can do that if you use fun instead of primrec, but it is not what you want to do here: You want to instead handle the cases Zero and Suc (see my solution). In your definition, mult Zero n would even be undefined.
Find all Pairs definition
Simplify meta-universally quantified assumptions with equality
What is the syntax to use Map.thy
Collecting locally fixed parameters using Eisbach
Why does simp “fail to apply initial proof method” where blast succeeds with the same facts?
Proving a theorem about parser combinators
Manually adding an assumption to the simplifier (Isabelle)
Proving something is an instance of a locale in Isabelle
Defining multiple constants in an integral
Definition without recursion, by cases, in Isabelle
Using a definition to produce an specific example of a locale in Isabelle
Should I use universal quantification in lemma formulation?
Using syntax/translations wiith locales
Quotienting a mutually recursive family of datatypes
L2Norm with Integration
Error defining dataype in Isabelle