含意と特称
以前にも書いた排中律ネタですが,今回は連言から存在量化を纏める形のものです.
g `!p:A->bool. !q:bool. (?x. p x ==> q) ==> (?y. q ==> p y) ==> (?z. p z <=> q)`;; e( REPEAT STRIP_TAC );; e( DISJ_CASES_TAC (SPEC `q:bool` EXCLUDED_MIDDLE) );; e( EXISTS_TAC `y:A` THEN EQ_TAC );; e( DISCH_TAC THEN GET_THEN 2 ACCEPT_TAC );; e( GET_THEN 1 ACCEPT_TAC );; e( EXISTS_TAC `x:A` THEN EQ_TAC );; e( GET_THEN 0 ACCEPT_TAC );; e( ONCE_REWRITE_TAC [GSYM CONTRAPOS_THM] );; e( DISCH_TAC THEN GET_THEN 2 ACCEPT_TAC );; (UNDISCH_ALL o SPEC_ALL) (top_thm ()) ;;
# g `!p:A->bool. !q:bool. (?x. p x ==> q) ==> (?y. q ==> p y) ==> (?z. p z <=> q)`;; val it : goalstack = 1 subgoal (1 total) `!p q. (?x. p x ==> q) ==> (?y. q ==> p y) ==> (?z. p z <=> q)` # e( REPEAT STRIP_TAC );; val it : goalstack = 1 subgoal (1 total) 0 [`p x ==> q`] 1 [`q ==> p y`] `?z. p z <=> q` # e( DISJ_CASES_TAC (SPEC `q:bool` EXCLUDED_MIDDLE) );; val it : goalstack = 2 subgoals (2 total) 0 [`p x ==> q`] 1 [`q ==> p y`] 2 [`~q`] `?z. p z <=> q` 0 [`p x ==> q`] 1 [`q ==> p y`] 2 [`q`] `?z. p z <=> q` # e( EXISTS_TAC `y:A` THEN EQ_TAC );; val it : goalstack = 2 subgoals (3 total) 0 [`p x ==> q`] 1 [`q ==> p y`] 2 [`q`] `q ==> p y` 0 [`p x ==> q`] 1 [`q ==> p y`] 2 [`q`] `p y ==> q` # e( DISCH_TAC THEN GET_THEN 2 ACCEPT_TAC );; val it : goalstack = 1 subgoal (2 total) 0 [`p x ==> q`] 1 [`q ==> p y`] 2 [`q`] `q ==> p y` # e( GET_THEN 1 ACCEPT_TAC );; val it : goalstack = 1 subgoal (1 total) 0 [`p x ==> q`] 1 [`q ==> p y`] 2 [`~q`] `?z. p z <=> q` # e( EXISTS_TAC `x:A` THEN EQ_TAC );; val it : goalstack = 2 subgoals (2 total) 0 [`p x ==> q`] 1 [`q ==> p y`] 2 [`~q`] `q ==> p x` 0 [`p x ==> q`] 1 [`q ==> p y`] 2 [`~q`] `p x ==> q` # e( GET_THEN 0 ACCEPT_TAC );; val it : goalstack = 1 subgoal (1 total) 0 [`p x ==> q`] 1 [`q ==> p y`] 2 [`~q`] `q ==> p x` # e( ONCE_REWRITE_TAC [GSYM CONTRAPOS_THM] );; val it : goalstack = 1 subgoal (1 total) 0 [`p x ==> q`] 1 [`q ==> p y`] 2 [`~q`] `~p x ==> ~q` # e( DISCH_TAC THEN GET_THEN 2 ACCEPT_TAC );; val it : goalstack = No subgoals # (UNDISCH_ALL o SPEC_ALL) (top_thm ()) ;; val it : thm = ?y. q ==> p y, ?x. p x ==> q |- ?z. p z <=> q