src/HOL/ex/Refute_Examples.thy
changeset 35315 fbdc860d87a3
parent 34120 f9920a3ddf50
child 35416 d8d7d1b785af
equal deleted inserted replaced
35282:8fd9d555d04d 35315:fbdc860d87a3
  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