equal
deleted
inserted
replaced
1415 refute |
1415 refute |
1416 oops |
1416 oops |
1417 |
1417 |
1418 (*****************************************************************************) |
1418 (*****************************************************************************) |
1419 |
1419 |
1420 subsubsection {* Axiomatic type classes and overloading *} |
1420 subsubsection {* Type classes and overloading *} |
1421 |
1421 |
1422 text {* A type class without axioms: *} |
1422 text {* A type class without axioms: *} |
1423 |
1423 |
1424 axclass classA |
1424 class classA |
1425 |
1425 |
1426 lemma "P (x::'a::classA)" |
1426 lemma "P (x::'a::classA)" |
1427 refute |
1427 refute |
1428 oops |
1428 oops |
1429 |
1429 |
1430 text {* The axiom of this type class does not contain any type variables: *} |
|
1431 |
|
1432 axclass classB |
|
1433 classB_ax: "P | ~ P" |
|
1434 |
|
1435 lemma "P (x::'a::classB)" |
|
1436 refute |
|
1437 oops |
|
1438 |
|
1439 text {* An axiom with a type variable (denoting types which have at least two elements): *} |
1430 text {* An axiom with a type variable (denoting types which have at least two elements): *} |
1440 |
1431 |
1441 axclass classC < type |
1432 class classC = |
1442 classC_ax: "\<exists>x y. x \<noteq> y" |
1433 assumes classC_ax: "\<exists>x y. x \<noteq> y" |
1443 |
1434 |
1444 lemma "P (x::'a::classC)" |
1435 lemma "P (x::'a::classC)" |
1445 refute |
1436 refute |
1446 oops |
1437 oops |
1447 |
1438 |
1449 refute -- {* no countermodel exists *} |
1440 refute -- {* no countermodel exists *} |
1450 oops |
1441 oops |
1451 |
1442 |
1452 text {* A type class for which a constant is defined: *} |
1443 text {* A type class for which a constant is defined: *} |
1453 |
1444 |
1454 consts |
1445 class classD = |
1455 classD_const :: "'a \<Rightarrow> 'a" |
1446 fixes classD_const :: "'a \<Rightarrow> 'a" |
1456 |
1447 assumes classD_ax: "classD_const (classD_const x) = classD_const x" |
1457 axclass classD < type |
|
1458 classD_ax: "classD_const (classD_const x) = classD_const x" |
|
1459 |
1448 |
1460 lemma "P (x::'a::classD)" |
1449 lemma "P (x::'a::classD)" |
1461 refute |
1450 refute |
1462 oops |
1451 oops |
1463 |
1452 |
1464 text {* A type class with multiple superclasses: *} |
1453 text {* A type class with multiple superclasses: *} |
1465 |
1454 |
1466 axclass classE < classC, classD |
1455 class classE = classC + classD |
1467 |
1456 |
1468 lemma "P (x::'a::classE)" |
1457 lemma "P (x::'a::classE)" |
1469 refute |
|
1470 oops |
|
1471 |
|
1472 lemma "P (x::'a::{classB, classE})" |
|
1473 refute |
1458 refute |
1474 oops |
1459 oops |
1475 |
1460 |
1476 text {* OFCLASS: *} |
1461 text {* OFCLASS: *} |
1477 |
1462 |
1481 done |
1466 done |
1482 |
1467 |
1483 lemma "OFCLASS('a::classC, type_class)" |
1468 lemma "OFCLASS('a::classC, type_class)" |
1484 refute -- {* no countermodel exists *} |
1469 refute -- {* no countermodel exists *} |
1485 apply intro_classes |
1470 apply intro_classes |
1486 done |
|
1487 |
|
1488 lemma "OFCLASS('a, classB_class)" |
|
1489 refute -- {* no countermodel exists *} |
|
1490 apply intro_classes |
|
1491 apply simp |
|
1492 done |
1471 done |
1493 |
1472 |
1494 lemma "OFCLASS('a::type, classC_class)" |
1473 lemma "OFCLASS('a::type, classC_class)" |
1495 refute |
1474 refute |
1496 oops |
1475 oops |