isabelle


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.

Related Links

Converting free variables to bound variables
Isabelle type unification/inference error
Substituting for the lambda expression in Isabelle
Apply simplifier to arbitrary term
need a definition in Isabelle to show that two partial functions never produce the same output
Why must Isabelle functions have at least one argument?
Working with generic definitions in Isabelle
completely replace the inner syntax in isar?
Applying lemma to solve goal
How to get the value of a const with ML code in Isabelle?
Expressing a simple declarative proof about exponents in Isar
How to make Isabelle use ZF?
How to prove “(∀x. P) ∧ Q ⟹ ∀x. P” using conjunct1 in Isabelle?
Simple lemma in Isabelle
Integration in Isabelle
Can I overload the notation for operators that are assigned to bool and list?

Categories

HOME
ibm-bluemix
jdo
cloud
gremlin
plone
angular-material
comparison
react-virtualized
lodash
sd-card
react-router
amazon-ecs
jxls
ebean
qt-creator
visual-studio-2005
systemc
django-cms
textfield
facebook-instant-articles
claims-based-identity
autosys
chromebook
user-interaction
traffic
fgetcsv
google-qpx-express-api
calibre
google-api-nodejs-client
mapbox-gl
html5-fullscreen
bower-install
jna
hue
fedex
gzipstream
grid.mvc
firebase-admin
vao
auto-update
upstart
fancybox-2
mu
drupal-6
boost-preprocessor
namecoin
arrow-keys
vtigercrm
xcb
bonobo
underscore.js-templating
google-web-starter-kit
etsy
prettytensor
rvest
design-by-contract
associative-array
angular-leaflet-directive
ideamart
angular-local-storage
e10s
offloading
clicktag
codeigniter-url
xcode-6.2
websocket4net
mcts
eclipse-memory-analyzer
comaddin
smtp-auth
robotics-studio
gil
quickdialog
runas
bubble-chart
spyware
javax.script
yui-datatable
krl
sortable-tables
routedevent
multi-tier
memory-size
w3wp
windows-live-messenger
ntvdm.exe

Resources

Database Users
RDBMS discuss
Database Dev&Adm
javascript
java
csharp
php
android
javascript
java
csharp
php
python
android
jquery
ruby
ios
html
Mobile App
Mobile App
Mobile App