使用 THENL 从 HOL 解释器翻译成 TAC_PROOF
Translating from HOL interpreter to TAC_PROOF with THENL
如果我按顺序将 THENL
括号中的步骤输入 HOL 解释器,它们将正常工作。但是当我使用 THENL
将它们与 TAC_PROOF
组合时,我得到一个错误。
我想我理解 THEN
和 THENL
之间的区别(所有子目标与单个子目标)。但是我找不到区分 2 个初始子目标的语法。 DISJ1_TAC
和 RES_TAC
应该只适用于子目标 1。而 DISJ2_TAC
和 RES_TAC
应该只适用于子目标 2。
我该如何解决这个问题?
val constructiveDilemmaRule =
TAC_PROOF (([],``! p q r s .(p==>q) /\ (r==>s) ==> p \/ r ==>q \/s``),
REPEAT STRIP_TAC
THENL [DISJ1_TAC THEN RES_TAC]
THENL [DISJ2_TAC, RES_TAC]);
你快搞定了。应用 REPEAT STRIP_TAC
给出了两个子目标,因此 THENL
的列表参数应该包含两个策略:
val g = (([], ``! p q r s .(p ==> q) /\ (r ==> s) ==> p \/ r ==> q \/ s``) : goal);
val tac = (REPEAT STRIP_TAC)
THENL [DISJ1_TAC THEN RES_TAC,
DISJ2_TAC THEN RES_TAC];
val constructiveDilemmaRule = TAC_PROOF (g, tac);
参数列表的第一个元素 (DISJ1_TAC...
) 应用于第一个子目标。参数列表的第二个元素 (DISJ2_TAC
) 应用于第二个子目标。
如果我按顺序将 THENL
括号中的步骤输入 HOL 解释器,它们将正常工作。但是当我使用 THENL
将它们与 TAC_PROOF
组合时,我得到一个错误。
我想我理解 THEN
和 THENL
之间的区别(所有子目标与单个子目标)。但是我找不到区分 2 个初始子目标的语法。 DISJ1_TAC
和 RES_TAC
应该只适用于子目标 1。而 DISJ2_TAC
和 RES_TAC
应该只适用于子目标 2。
我该如何解决这个问题?
val constructiveDilemmaRule =
TAC_PROOF (([],``! p q r s .(p==>q) /\ (r==>s) ==> p \/ r ==>q \/s``),
REPEAT STRIP_TAC
THENL [DISJ1_TAC THEN RES_TAC]
THENL [DISJ2_TAC, RES_TAC]);
你快搞定了。应用 REPEAT STRIP_TAC
给出了两个子目标,因此 THENL
的列表参数应该包含两个策略:
val g = (([], ``! p q r s .(p ==> q) /\ (r ==> s) ==> p \/ r ==> q \/ s``) : goal);
val tac = (REPEAT STRIP_TAC)
THENL [DISJ1_TAC THEN RES_TAC,
DISJ2_TAC THEN RES_TAC];
val constructiveDilemmaRule = TAC_PROOF (g, tac);
参数列表的第一个元素 (DISJ1_TAC...
) 应用于第一个子目标。参数列表的第二个元素 (DISJ2_TAC
) 应用于第二个子目标。