On Wed, Feb 13, 2019 at 12:02:59AM -0500, David A. Wheeler wrote:
> On Tue, 12 Feb 2019 20:18:43 -0800 (PST), Haitao Zhang <
zht...@gmail.com> wrote:
> > I am confused about how implication can be proved in Metamath. I am used to
> > the intros tactic. What is the corresponding procedure here?
> Metamath tools currently don't have anything that is exactly like the "tactic languages"
> of Coq & the HOL family. In those systems, you provide steps that are not
> really the proof, but programming steps that help the computer rediscover
> the proof.
This is not entirely accurate. I used
https://github.com/Drahflow/Igor
for creating the huge program covering proofs I once posted on the list
(that project is currently paused, not for lack of progress but for
other more economically useful things going on)
While this tools is clearly not as user-friendly as mmj2 is
(and I just notice I never got around writing documentation :( )
a session could go like this:
% prove lem-strimm
0) |- ( ( X step Y /\ ( ( X reg ; 1 5 ) = Z /\ ( ( X mem ( Z + 0 ) ) = 0
/\ ( ( X mem ( Z + 1 ) ) = ( ; 1 6 x. R ) /\ ( ( X mem ( Z + 2 ) ) = ( ;
; 1 2 8 + Q ) /\ ( ( X mem ( Z + 3 ) ) = ; ; 2 2 9 /\ ( R e. NN0 /\ ( R
<_ ; 1 4 /\ ( Q e. NN0 /\ ( Q <_ ; 1 4 /\ ( ( X reg Q ) mod 4 ) = 0 ) )
) ) ) ) ) ) ) ) -> ( ( Y mem32 ( X reg Q ) ) = ( X reg R ) /\ ( ( Y reg
; 1 5 ) = ( Z + 4 ) /\ ( A. q ( q <_ ; 1 4 -> ( Y reg q ) = ( X reg q )
) /\ A. m e. cpu-mem ( ( m < ( X reg Q ) \/ ( ( X reg Q ) + 3 ) < m ) ->
( Y mem m ) = ( X mem m ) ) ) ) ) )
% autoall
% antedisp
* X step Y
* ( X reg ; 1 5 ) = Z
* ( X mem ( Z + 0 ) ) = 0
* ( X mem ( Z + 1 ) ) = ( ; 1 6 x. R )
* ( X mem ( Z + 2 ) ) = ( ; ; 1 2 8 + Q )
* ( X mem ( Z + 3 ) ) = ; ; 2 2 9
* R e. NN0
* R <_ ; 1 4
* Q e. NN0
* Q <_ ; 1 4
* ( ( X reg Q ) mod 4 ) = 0
-------------------------------------------------
( ( Y mem32 ( X reg Q ) ) = ( X reg R ) /\ ( ( Y reg ; 1 5 ) = ( Z + 4
) /\ ( A. q ( q <_ ; 1 4 -> ( Y reg q ) = ( X reg q ) ) /\ A. m e.
cpu-mem ( ( m < ( X reg Q ) \/ ( ( X reg Q ) + 3 ) < m ) -> ( Y mem m
) = ( X mem m ) ) ) ) )
% conclude ( ( Y mem ( ( X reg Q ) + 0 ) ) = ( uint8 ` ( X reg R ) ) /\ (
( Y mem ( ( X reg Q ) + 1 ) ) = ( uint8 ` ( |_ ` ( ( X reg R ) / ; ; 2 5
6 ) ) ) /\ ( ( Y mem ( ( X reg Q ) + 2 ) ) = ( uint8 ` ( |_ ` ( ( X reg
R ) / ; ; ; ; 6 5 5 3 6 ) ) ) /\ ( ( Y mem ( ( X reg Q ) + 3 ) ) = (
uint8 ` ( |_ ` ( ( X reg R ) / ; ; ; ; ; ; ; 1 6 7 7 7 2 1 6 ) ) ) /\ (
( Y reg ; 1 5 ) = ( Z + 4 ) /\ ( A. q ( q <_ ; 1 4 -> ( Y reg q ) = ( X
reg q ) ) /\ A. m e. cpu-mem ( ( m < ( X reg Q ) \/ ( ( X reg Q ) + 3 )
< m ) -> ( Y mem m ) = ( X mem m ) ) ) ) ) ) ) )
* ( ( Y mem ( ( X reg Q ) + 0 ) ) = ( uint8 ` ( X reg R ) ) /\ ( ( Y mem
( ( X reg Q ) + 1 ) ) = ( uint8 ` ( |_ ` ( ( X reg R ) / ; ; 2 5 6 ) )
) /\ ( ( Y mem ( ( X reg Q ) + 2 ) ) = ( uint8 ` ( |_ ` ( ( X reg R )
/ ; ; ; ; 6 5 5 3 6 ) ) ) /\ ( ( Y mem ( ( X reg Q ) + 3 ) ) = ( uint8
` ( |_ ` ( ( X reg R ) / ; ; ; ; ; ; ; 1 6 7 7 7 2 1 6 ) ) ) /\ ( ( Y
reg ; 1 5 ) = ( Z + 4 ) /\ ( A. q ( q <_ ; 1 4 -> ( Y reg q ) = ( X
reg q ) ) /\ A. m e. cpu-mem ( ( m < ( X reg Q ) \/ ( ( X reg Q ) + 3
) < m ) -> ( Y mem m ) = ( X mem m ) ) ) ) ) ) ) )
* X step Y
* ( X reg ; 1 5 ) = Z
* ( X mem ( Z + 0 ) ) = 0
* ( X mem ( Z + 1 ) ) = ( ; 1 6 x. R )
* ( X mem ( Z + 2 ) ) = ( ; ; 1 2 8 + Q )
* ( X mem ( Z + 3 ) ) = ; ; 2 2 9
* R e. NN0
* R <_ ; 1 4
* Q e. NN0
* Q <_ ; 1 4
* ( ( X reg Q ) mod 4 ) = 0
-------------------------------------------------
( ( Y mem32 ( X reg Q ) ) = ( X reg R ) /\ ( ( Y reg ; 1 5 ) = ( Z + 4
) /\ ( A. q ( q <_ ; 1 4 -> ( Y reg q ) = ( X reg q ) ) /\ A. m e.
cpu-mem ( ( m < ( X reg Q ) \/ ( ( X reg Q ) + 3 ) < m ) -> ( Y mem m
) = ( X mem m ) ) ) ) )
% normalize:ante
* ( Y mem ( ( X reg Q ) + 0 ) ) = ( uint8 ` ( X reg R ) )
* ( Y mem ( ( X reg Q ) + 1 ) ) = ( uint8 ` ( |_ ` ( ( X reg R ) / ; ; 2 5 6 ) ) )
* ( Y mem ( ( X reg Q ) + 2 ) ) = ( uint8 ` ( |_ ` ( ( X reg R ) / ; ; ; ; 6 5 5 3 6 ) ) )
* ( Y mem ( ( X reg Q ) + 3 ) ) = ( uint8 ` ( |_ ` ( ( X reg R ) / ; ; ; ; ; ; ; 1 6 7 7 7 2 1 6 ) ) )
* ( Y reg ; 1 5 ) = ( Z + 4 )
* A. q ( q <_ ; 1 4 -> ( Y reg q ) = ( X reg q ) )
* A. m e. cpu-mem ( ( m < ( X reg Q ) \/ ( ( X reg Q ) + 3 ) < m ) -> ( Y mem m ) = ( X mem m ) )
* X step Y
* ( X reg ; 1 5 ) = Z
* ( X mem ( Z + 0 ) ) = 0
* ( X mem ( Z + 1 ) ) = ( ; 1 6 x. R )
* ( X mem ( Z + 2 ) ) = ( ; ; 1 2 8 + Q )
* ( X mem ( Z + 3 ) ) = ; ; 2 2 9
* R e. NN0
* R <_ ; 1 4
* Q e. NN0
* Q <_ ; 1 4
* ( ( X reg Q ) mod 4 ) = 0
-------------------------------------------------
( ( Y mem32 ( X reg Q ) ) = ( X reg R ) /\ ( ( Y reg ; 1 5 ) = ( Z + 4
) /\ ( A. q ( q <_ ; 1 4 -> ( Y reg q ) = ( X reg q ) ) /\ A. m e.
cpu-mem ( ( m < ( X reg Q ) \/ ( ( X reg Q ) + 3 ) < m ) -> ( Y mem m
) = ( X mem m ) ) ) ) )
% rewrite ( Y mem32 ( X reg Q ) ) = ( ( ( ( ( Y mem ( ( X reg Q ) + 3 ) )
x. ; ; ; ; ; ; ; 1 6 7 7 7 2 1 6 ) + ( ( Y mem ( ( X reg Q ) + 2 ) ) x.
; ; ; ; 6 5 5 3 6 ) ) + ( ( Y mem ( ( X reg Q ) + 1 ) ) x. ; ; 2 5 6 ) )
+ ( Y mem ( ( X reg Q ) + 0 ) ) )
% use df-mem32
* ( Y mem ( ( X reg Q ) + 0 ) ) = ( uint8 ` ( X reg R ) )
* ( Y mem ( ( X reg Q ) + 1 ) ) = ( uint8 ` ( |_ ` ( ( X reg R ) / ; ; 2 5 6 ) ) )
* ( Y mem ( ( X reg Q ) + 2 ) ) = ( uint8 ` ( |_ ` ( ( X reg R ) / ; ; ; ; 6 5 5 3 6 ) ) )
* ( Y mem ( ( X reg Q ) + 3 ) ) = ( uint8 ` ( |_ ` ( ( X reg R ) / ; ; ; ; ; ; ; 1 6 7 7 7 2 1 6 ) ) )
* ( Y reg ; 1 5 ) = ( Z + 4 )
* A. q ( q <_ ; 1 4 -> ( Y reg q ) = ( X reg q ) )
* A. m e. cpu-mem ( ( m < ( X reg Q ) \/ ( ( X reg Q ) + 3 ) < m ) -> ( Y mem m ) = ( X mem m ) )
* X step Y
* ( X reg ; 1 5 ) = Z
* ( X mem ( Z + 0 ) ) = 0
* ( X mem ( Z + 1 ) ) = ( ; 1 6 x. R )
* ( X mem ( Z + 2 ) ) = ( ; ; 1 2 8 + Q )
* ( X mem ( Z + 3 ) ) = ; ; 2 2 9
* R e. NN0
* R <_ ; 1 4
* Q e. NN0
* Q <_ ; 1 4
* ( ( X reg Q ) mod 4 ) = 0
-------------------------------------------------
( ( ( ( ( ( Y mem ( ( X reg Q ) + 3 ) ) x. ; ; ; ; ; ; ; 1 6 7 7 7 2 1
6 ) + ( ( Y mem ( ( X reg Q ) + 2 ) ) x. ; ; ; ; 6 5 5 3 6 ) ) + ( ( Y
mem ( ( X reg Q ) + 1 ) ) x. ; ; 2 5 6 ) ) + ( Y mem ( ( X reg Q ) + 0
) ) ) = ( X reg R ) /\ ( ( Y reg ; 1 5 ) = ( Z + 4 ) /\ ( A. q ( q <_
; 1 4 -> ( Y reg q ) = ( X reg q ) ) /\ A. m e. cpu-mem ( ( m < ( X
reg Q ) \/ ( ( X reg Q ) + 3 ) < m ) -> ( Y mem m ) = ( X mem m ) ) )
) )
% rewrite ( Y mem ( ( X reg Q ) + 0 ) ) = ( uint8 ` ( X reg R ) )
% rewrite ( Y mem ( ( X reg Q ) + 1 ) ) = ( uint8 ` ( |_ ` ( ( X reg R ) /
; ; 2 5 6 ) ) )
% rewrite ( Y mem ( ( X reg Q ) + 2 ) ) = ( uint8 ` ( |_ ` ( ( X reg R ) /
; ; ; ; 6 5 5 3 6 ) ) )
% rewrite ( Y mem ( ( X reg Q ) + 3 ) ) = ( uint8 ` ( |_ ` ( ( X reg R ) /
; ; ; ; ; ; ; 1 6 7 7 7 2 1 6 ) ) )
% normalize
* ( uint8 ` ( X reg R ) ) = ( uint8 ` ( X reg R ) )
* ( uint8 ` ( |_ ` ( ( X reg R ) / ; ; 2 5 6 ) ) ) = ( uint8 ` ( |_ ` ( ( X reg R ) / ; ; 2 5 6 ) ) )
* ( uint8 ` ( |_ ` ( ( X reg R ) / ; ; ; ; 6 5 5 3 6 ) ) ) = ( uint8 ` ( |_ ` ( ( X reg R ) / ; ; ; ; 6 5 5 3 6 ) ) )
* ( uint8 ` ( |_ ` ( ( X reg R ) / ; ; ; ; ; ; ; 1 6 7 7 7 2 1 6 ) ) ) = ( uint8 ` ( |_ ` ( ( X reg R ) / ; ; ; ; ; ; ; 1 6 7 7 7 2 1 6 ) ) )
* ( Y reg ; 1 5 ) = ( Z + 4 )
* A. q ( q <_ ; 1 4 -> ( Y reg q ) = ( X reg q ) )
* A. m e. cpu-mem ( ( m < ( X reg Q ) \/ ( ( X reg Q ) + 3 ) < m ) -> ( Y mem m ) = ( X mem m ) )
* X step Y
* ( X reg ; 1 5 ) = Z
* ( X mem ( Z + 0 ) ) = 0
* ( X mem ( Z + 1 ) ) = ( ; 1 6 x. R )
* ( X mem ( Z + 2 ) ) = ( ; ; 1 2 8 + Q )
* ( X mem ( Z + 3 ) ) = ; ; 2 2 9
* R e. NN0
* R <_ ; 1 4
* Q e. NN0
* Q <_ ; 1 4
* ( ( X reg Q ) mod 4 ) = 0
-------------------------------------------------
( ( ( ( ( uint8 ` ( |_ ` ( ( X reg R ) / ; ; ; ; ; ; ; 1 6 7 7 7 2 1 6
) ) ) x. ; ; ; ; ; ; ; 1 6 7 7 7 2 1 6 ) + ( ( uint8 ` ( |_ ` ( ( X
reg R ) / ; ; ; ; 6 5 5 3 6 ) ) ) x. ; ; ; ; 6 5 5 3 6 ) ) + ( ( uint8
` ( |_ ` ( ( X reg R ) / ; ; 2 5 6 ) ) ) x. ; ; 2 5 6 ) ) + ( uint8 `
( X reg R ) ) ) = ( X reg R )
% drop everything matching Z
% drop everything matching q
% drop everything matching m
% conclude X e. armstates
% with only X step Y
% drop X step Y
% drop everything matching uint8
* X e. armstates
* R e. NN0
* R <_ ; 1 4
* Q e. NN0
* Q <_ ; 1 4
* ( ( X reg Q ) mod 4 ) = 0
-------------------------------------------------
( ( ( ( ( uint8 ` ( |_ ` ( ( X reg R ) / ; ; ; ; ; ; ; 1 6 7 7 7 2 1 6
) ) ) x. ; ; ; ; ; ; ; 1 6 7 7 7 2 1 6 ) + ( ( uint8 ` ( |_ ` ( ( X
reg R ) / ; ; ; ; 6 5 5 3 6 ) ) ) x. ; ; ; ; 6 5 5 3 6 ) ) + ( ( uint8
` ( |_ ` ( ( X reg R ) / ; ; 2 5 6 ) ) ) x. ; ; 2 5 6 ) ) + ( uint8 `
( X reg R ) ) ) = ( X reg R )
... and so on until finally ...
% export:disj
$d X n $. $d R n $.
% export:compressed
( co cdc carmreg wa c6 c1 cfv wceq caddc c5 c2 cv c7 cmem wbr cuint8 c4
cdiv cfl c3 cle wcel cc0 cmul cn0 wi clt cmo wral wo ccpumem wal c9
cstep vn c8 carmstates id anim2i cmem32 oveq1d syl simpl adantl eqeq1d
anbi1d a1i fveq2d adantl4 jca imbi12d mpbird mpcom oveq12d mpd anbi2d
oveq2d adantl2 animpass mpancom arm_strimm df-mem32 adantl3 armstep1
arm_reg32 lem-uint32-uint8 expcom rgen arm_regnn0 ax-17 breq1d eqeq12d
rcla4 anbi2d4 imbi2d expcom2 expcom4 animpass4 ) EDAJHZUJPHUAHZDBJHZUCNZ
OZEXFMPHUAHZXHRQILIZUEHZUFNZUCNZOZEXFRPHUAHZXHLQIQIUGILIZUEHZUFNZUCNZOZE
<...snip...>
KYSUVHUULUVGXHUVHVEVLVMXBVSVTXCXDWFWFXEWG $.
It's definitely not as generic as Isabelle/HOL, but I think quite a
notch more abstract than the tools we traditionally use for metamath.
Regards,
Drahflow