(* import("tactic.lua") *)
variables p q r : Bool

theorem T1 : p => q => p /\ q :=
   discharge (fun H1,
      discharge (fun H2,
            let H1 : p := _,
                H2 : q := _
            in and::intro H1 H2
         )).
    exact -- solve first metavar
    done
    exact -- solve second metavar
    done

(*
simple_tac = Repeat(imp_tac() ^ conj_tac() ^ assumption_tac())
*)

theorem T2 : p => q => p /\ q /\ p := _.
    simple_tac
    done

print environment 1

theorem T3 : p => p /\ q => r => q /\ r /\ p := _.
    (* Repeat(OrElse(imp_tac(), conj_tac(), conj_hyp_tac(), assumption_tac())) *)
    done

-- Display proof term generated by previous tac
print environment 1

theorem T4 : p => p /\ q => r => q /\ r /\ p := _.
    Repeat (OrElse (apply discharge) (apply and::intro) conj_hyp exact)
    done

-- Display proof term generated by previous tac --
print environment 1