In this discussion on the Isabelle mailing list, I am missing the question
of the correctness of the small logical kernel that should guarantee
the correctness of the whole system.

Currently, the arguments presented so far seem to open up a false alternative
between logically correct (reliable) but small theorem provers (e.g., HOL Zero),
and large and practical but less reliable provers (e.g., Isabelle/HOL):
> The other big provers (e.g. Coq) are similar in this respect. […]
> HOL-Zero is a notable exception in targeting a market of potentially
> malicious (ab-)users, but it is not a "big prover".
According to this idea, any reliable prover/checker must be small,
and any practical (and hence, large) prover isn't reliable.
But the concept of a small logical kernel that guarantees
the correctness of the whole system states exactly the opposite,
i.e., no matter how large and practical the software is, it remains reliable.

This concept is given up in arguments like
> We do not have to work on the basis that "X has been proved, therefore X is 
> true", but rather "We have been given a proof of X; Is it credible?" 
which even seems to rhetorically downplay a desirable must-have (correctness)
as an annoying impediment to get rid of ("do not have to work on the basis").
In particular, transferring the responsibility for providing reliability 
(correctness)
from (verifying) the small logical kernel to either examining specific parts of
the formalized proof or estimating the credibility of the supplying person is 
questionable,
as even the best mathematicians from time to time fail at complex proofs:
> Then we can look at any part of this proof where we have doubts. […]

> The effort we choose to invest in this would depend on how important X is and 
> how much we distrust the person who supplied the proof.

I do not see any alternative to providing a correct small logical kernel.

Preserving logical dependencies is part of (has to be guaranteed by) the 
logical kernel.
For this reason, I consider the following phenomenon as highly problematic
(and even as a failure of the logical kernel):
>> found this originally, but you can hide the ‘taint’ of a theorem by
>> going through a type class instantiation:
If a conditional can be stripped off so easily, it might be possible to obtain 
from
different conditionals two contradictory theorems, and hence, an inconsistency.
In a related discussion about this question on the Metamath mailing list I 
argued
in favor of introducing all non-logical axioms as conditionals (hence, Q0 and 
R0 have only five axioms)
in order to make the dependency explicit:
> Third, the dependency is made explicit. If "the software tracks
> axiom usage, as Metamath does", the task of tracking dependencies
> is moved from the logic to the software, which I already, in another
> context, criticized at Kunčar/Popescu's approach (which is
> nevertheless legitimate as an auxiliary approach).
> […] Andrews' exercise X5308 […] stated and 
> formalized on pp. 151 ff. of
>       http://www.owlofminerva.net/files/formulae.pdf
> is taken as an example where the dependency of the theorem
> is make explicit, assuming the form
>       AC => theorem
> since the (non-logical) Axiom of Choice was
> introduced as a conditional, not as an axiom.

        https://groups.google.com/d/msg/metamath/WwKPkCGoZkg/VSAVebXPCQAJ
Norman Megill presented a similar example:
> It is certainly possible to prefix every theorem with "ZFC ->"

        https://groups.google.com/d/msg/metamath/WwKPkCGoZkg/nvmXHUffCQAJ
I agree with Norman Megill that in certain practical contexts constantly 
displaying
the same conditional prefix may be redundant, but this is a question of the 
user interface
(which could, for example, replace the default prefix – e.g., "ZFC ->" – by a 
star "*"), but not a
matter relevant for the logical kernel, where this dependency should be made 
explicit.

As mentioned earlier, the Isabelle concept of axiomatic type classes as 
described and discussed in 
        https://www4.in.tum.de/~wenzelm/papers/axclass-TPHOLs97.pdf
and introduced in
> Prover-powered type classes were introduced by Nipkow and Snelting [28] in 
> Isabelle/HOL
> and by Sozeau and Oury [32] in Coq—they additionally feature verifiability
> of the type-class conditions upon instantiation: a type T is accepted as a 
> member
> of the semigroup class only if associativity can be proved for its + 
> operation.

        http://www21.in.tum.de/~kuncar/documents/kuncar-popescu-itp2015.pdf (p. 
3)
is considered as a preliminary solution by me, since the same fact can be 
expressed 
very naturally with the means of type abstraction (as suggested by Mike Gordon, 
see first quote at
        
http://owlofminerva.net/kubota/software-implementation-of-the-mathematical-logic-r0-available-for-download/
) and as argued and demonstrated at pp. 12, 362, 420 of
        http://www.owlofminerva.net/files/formulae.pdf
Here, the fact that (o,XOR) is a group, formalized as
        Grp o XOR
(p. 420) can be stated only after proving the three group axioms for (o,XOR),
and only after that, a general proof on groups (Uniqueness of the Group 
Identity Element, pp. 362 ff.) 
can be instantiated (transferred) to the specific XOR group without having to 
carry out the proof again
(Uniqueness of the Group Identity Element of the XOR Group, pp. 420 ff.).

Coq is not suited for a comparison. It is very expressive (e.g., it has 
dependent types),
but there is profound criticism raised by Freek Wiedijk and John Harrison (and 
Josef Urban),
see section 3 of
        http://doi.org/10.4444/100.111
and for an example the rule on top of p. 54 at
        http://www.cl.cam.ac.uk/~jrh13/papers/joerg.pdf
which is very far from a natural expression of formal logic and mathematics.

The Isabelle documentation is discussed quite often.
> Extensive documentation is available.
        http://www.cl.cam.ac.uk/~lp15/papers/Formath/Goedel-ar.pdf (p. 3)
> The problem remains open: How can true expertise about how Isabelle
> really works be reconstructed? We've seen a slow and steady decline in
> the past 10 years, and myself writing hundreds of pages of documentation
> helped only very little.

It is always claimed that the Isabelle documentation is ample, but 
unfortunately,
it is not logically structured, which makes the extent of the documentation
rather a disadvantage than an advantage.
For comparison, the HOL/HOL4 documentation provides a precise and quick 
introduction,
which allowed me to fully comprehend the logic, install the software and
carry out proofs very quickly. It has, as one would expect, a separate logic 
part
(Part III: The HOL Logic [Gordon and Melham, 1993, pp. 191–232]), available 
online at
        
http://freefr.dl.sourceforge.net/project/hol/hol/kananaskis-11/kananaskis-11-logic.pdf
and a very good guidebook which allows one to inspect the details of the system:
        https://hol-theorem-prover.org/guidebook/
I already made suggestions for improvements earlier:
> Although of course Isabelle/HOL is a very good piece of software, this 
> precision is currently missing in my opinion.
> The extension from classical HOL to Gordon's HOL can be found in section 11.7 
> (p. 261), as well as the
> (single) extension from Gordon's HOL to Isabelle/HOL ("Isabelle/HOL goes 
> beyond Gordon-style HOL
> by admitting overloaded constant definitions") within a document of 13 
> chapters and 330 pages,
> which makes it practically impossible to identify and locate important 
> features and extensions of the core logic
> within a reasonable amount of time:
>       
> http://www.cl.cam.ac.uk/research/hvg/Isabelle/dist/Isabelle2016/doc/isar-ref.pdf

        
https://lists.cam.ac.uk/pipermail/cl-isabelle-users/2016-October/msg00050.html
Essential information on the logic is hidden somewhere between many technical 
details,
and at the first glance I can't even see a reason for why the extension of the 
HOL logic is
described in the Isar reference, and not in the Isabelle/HOL reference.
With the HOL/HOL4 documentation, I was able to understand the logic and study
the details of the proof technology within 24 hours (see example files 
attached),
but with the Isabelle/HOL documentation, even after many months the details
are obscure. Moreover, the concept of a small logical kernel should be reflected
in the documentation by a separate logic part, as in the HOL/HOL4 documentation.
The Isabelle/HOL documentation currently doesn't conform to this clear standard
established by the original HOL system.

The emails quoted are attached below.
The full discussion is available at
        https://lists.cam.ac.uk/pipermail/cl-isabelle-users/2017-July/date.html

____________________________________________________

Ken Kubota
http://doi.org/10.4444/100



> Am 08.07.2017 um 20:59 schrieb Lawrence Paulson <l...@cam.ac.uk>:
> 
> To protect against malicious intentions would turn Isabelle into a form of 
> security software. But the guarantees we get from the latter are quite 
> different from what we get from a formal proof. Ultimately security claims 
> depend upon trusting a lot of complicated mechanisms, such as certificate 
> authorities and cryptosystems. We are not a lot better off than when a model 
> checker comes back with nothing.
> 
> However, we work with formal proofs, which can be examined, even 
> interactively. We do not have to work on the basis that "X has been proved, 
> therefore X is true", but rather "We have been given a proof of X; Is it 
> credible?" Then we can look at any part of this proof where we have doubts. A 
> devious user has many ways to try to fool us, but it's not so easy if he has 
> to supply the full source code and we insist on legibility throughout. The 
> effort we choose to invest in this would depend on how important X is and how 
> much we distrust the person who supplied the proof.
> 
> Larry Paulson
> 
>> On 8 Jul 2017, at 18:12, scott constable <sdcon...@syr.edu> wrote:
>> 
>> Isabelle does not protect against malicious intentions. It would require
>> a quite different system to do that, one that you won't like to use.
>> 
>> The other big provers (e.g. Coq) are similar in this respect.


> Am 08.07.2017 um 12:46 schrieb Makarius <makar...@sketis.net>:
> 
> On 07/07/17 18:37, scott constable wrote:
>> 
>> possibly written by other persons with malicious intentions.
> 
> Isabelle does not protect against malicious intentions. It would require
> a quite different system to do that, one that you won't like to use.
> 
> The other big provers (e.g. Coq) are similar in this respect.
> 
> HOL-Zero is a notable exception in targeting a market of potentially
> malicious (ab-)users, but it is not a "big prover".
> 
> 
>       Makarius


> On 08/07/17 13:01, Manuel Eberl wrote:
>> Unfortunately, it is very easy to circumvent this. I don't recall who
>> found this originally, but you can hide the ‘taint’ of a theorem by
>> going through a type class instantiation:
> 
> "Found this originally" sounds very funny to me.
> 
> Of course, the problem of oracles vs. type classes instantiations is as
> old as oracles and type class instantiations in Isabelle. It is rather
> well-known for insiders.
> 
> 
> So we are back to the new meta-problem from recent years: even power
> users don't know anymore what Isabelle is and what it does, and
> especially what it does not.
> 
> 
>       Makarius


> Am 08.07.2017 um 16:03 schrieb Makarius <makar...@sketis.net>:
> 
> On 08/07/17 15:33, Tobias Nipkow wrote:
> 
> […]
> 
>> It is usually due to a fanciful interpretation of the documentation. The
>> latter says that "The system always records oracle invocations within
>> derivations of theorems by a unique tag." but does not claim that these
>> tags are also always inherited in the way one is all too likely to
>> assume.
> 
> The problem remains open: How can true expertise about how Isabelle
> really works be reconstructed? We've seen a slow and steady decline in
> the past 10 years, and myself writing hundreds of pages of documentation
> helped only very little.
> 
> 
>       Makarius


____________________________________________________

Makefile
____________________________________________________

SRCS = types.sml
OBJS =
TGTS = $(SRCS:.sml=.out)
CC   = $(HOME)/HOL/bin/hol

.PHONY: all clean view full edit


all:    $(TGTS)

clean:
        rm -f $(OBJS) $(TGTS)

view:   all
        open -t $(TGTS)

full:   clean all view

edit:
        open -a xcode Makefile $(SRCS)


%.out:  %.sml
        $(CC) < $< > $@

____________________________________________________

types.sml
____________________________________________________

(*  TO DO List

    HOL terms vs. types (different syntactical category)

    LCF: rules of inference (type thm)

    terms as trees?


    * type operators: fun, pair, list
    * pairs
    * 3 extensions


*)




(* prove that a figure - a number from 0 to 9 - exists *)

app load ["Q"]; open arithmeticTheory;
val figure_def = Define `figure a = a < 10`;
g `?x. figure x`;
e (RW_TAC arith_ss [figure_def]);
val FIGURE_EXISTS = top_thm();
drop();


(* create type "figure" (tyfi) and an object (a variable) of that type *)

val figure_axiom = new_type_definition ("tyfi", FIGURE_EXISTS);
(* show new type *) types "-";

val figure_object = ``a:tyfi = a``;
(* show type of object *) set_trace "types" 1; figure_object;
(* show type of object *) set_trace "types" 2; figure_object;
set_trace "types" 0;


(*  But figure 3 doesn't have type "tyfi",
    which would be desirable, and the following fails:
        ``3:tyfi``;

    The reason is, that in HOL terms can only have a single type.
    (Types are disjoint.)                                          *);

type_of ``3``;











(* show universal quantifier *)
dest_comb ``!x.x``;


(* show type of universal quantifier *)
type_of ``$!``;


(* find theory of universal quantifier *)
dest_thy_const ``$!``;


(* show some information about the theory "bool" *)

thy "bool";

axioms "bool";
definitions "bool";
theorems "bool";

constants "bool";
types "bool";

ancestry "bool";


(* show some information about the theory "min" *)

types "min";
constants "min";


(* interactively we could do:
        help "arithmeticTheory";
*)


(* find definition in database *)
DB.find "FORALL_DEF";
DB.match ["arithmetic"] ``SUC n * x``;



(* type definition example from kananaskis-10-reference.pdf, p. 630 *)

app load ["PairedLambda", "Q"]; open PairedLambda pairTheory;
val tyax =
      new_type_definition ("three",
        Q.prove(`?p. (\(x,y). ~(x /\ y)) p`,
                Q.EXISTS_TAC `(F,F)` THEN GEN_BETA_TAC THEN REWRITE_TAC []));




open arithmeticTheory;
val divides_def = Define `divides a b = ?x. b = a * x`;
set_fixity "divides" (Infix(NONASSOC, 450));
val prime_def = Define `prime p = ~(p=1) /\ !x. x divides p ==> (x=1) \/ (x=p)`;
g `!x. x divides 0`;
e (RW_TAC arith_ss [divides_def]);
e (EXISTS_TAC ``0``);
e (RW_TAC arith_ss []);
restart();
e (RW_TAC arith_ss [divides_def] THEN EXISTS_TAC ``0``
     THEN RW_TAC arith_ss []);

____________________________________________________


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
hol-info mailing list
hol-info@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/hol-info

Reply via email to