diff --git a/.gitignore b/.gitignore index 48f1eed945af338290b452ec88ecc429e13054f4..efc9869525d36bdf6a1800bfc8be1353d4540ed9 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,6 @@ _minted-*/ *.run.xml *.nav *.bcf +*.idx +*.ilg +*.ind diff --git a/spec/alethe_rules.tex b/spec/alethe_rules.tex index 52d63700fc8d436c7a85c11895afe6f520ee4e06..b65e1d19d72c790a7128a83d1259b598257376e6 100644 --- a/spec/alethe_rules.tex +++ b/spec/alethe_rules.tex @@ -229,7 +229,7 @@ simplifications.} \ruleref{qnt_simplify} & Simplification of constant quantified formulas. \\ \end{xltabular} -\subject{Rule List} +\subsection{Rule List} \label{sec:alethe:rules-list} \begin{RuleDescription}{assume} @@ -440,7 +440,7 @@ $\geq 0$ if $\bowtie$ is $>$). % Just like in ConTeX we can't have minted in the rule environment for some % reason. \begin{RuleExample} -A simple \currule{} step in the logic \textsf{LRA} might look like this: +A simple \proofRule{la_generic} step in the logic \textsf{LRA} might look like this: \begin{AletheVerb} (step t10 (cl (not (> (f a) (f b))) (not (= (f a) (f b)))) @@ -455,7 +455,7 @@ not apply. Finally, after step~5 the conjunction is $(f\,a) - (f\,b) > 0 \land \end{RuleExample} \begin{RuleExample} -The following \currule{} step is from a \textsf{QF\_UFLIA} problem: +The following \proofRule{la_generic} step is from a \textsf{QF\_UFLIA} problem: \begin{AletheVerb} (step t11 (cl (not (<= f3 0)) (<= (+ 1 (* 4 f3)) 1)) :rule la_generic :args (1 (div 1 4))) @@ -724,7 +724,7 @@ into a clause denoted by \inlineAlethe{cl}. \end{RuleDescription} \begin{RuleExample} -An application of the \currule{} rule. +An application of the \proofRule{or} rule. \begin{AletheVerb} (step t15 (cl (or (= a b) (not (<= a b)) (not (<= b a)))) :rule la_disequality) @@ -1145,13 +1145,14 @@ $i$. & \ctxsep & $\Gamma$ & $\psi ≈ \varphi_1 \circ\cdots\circ\varphi_n$ & \cu \begin{RuleDescription}{ite_simplify} This rule simplifies an if-then-else term by applying equivalent - transformations until fix point\footnote{Note however that the order of the + transformations until fixed point\footnote{Note however that the order of the application is important, since the set of rules is not confluent. For example, the term $(\lsymb{ite} \top \; t_1 \; t_2 ≈ t_1)$ can be simplified into both $p$ and $(\neg (\neg p))$ depending on the order of applications.} % It has the form + \begin{AletheXS} $i$. & \ctxsep & $\Gamma$ & $\lsymb{ite}\,\varphi\,t_1\,t_2 ≈ u$ & \currule \\ \end{AletheXS} @@ -1211,7 +1212,7 @@ missing. \end{RuleDescription} \begin{RuleExample} -An application of the \currule{} rule on the term $(\forall x, y.\, x ≈ y +An application of the \proofRule{onepoint} rule on the term $(\forall x, y.\, x ≈ y \rightarrow (f\,x)\land (f\,y))$ look like this: \begin{AletheVerb} @@ -1466,6 +1467,7 @@ $i$. & \ctxsep & $\Gamma$ & $\bigcirc_{i=1}^{n} t_i ≈ (\dots( t_1\circ t_2) \ \end{AletheXS} If the operator $\circ$ is right associative, then the rule has the form + \begin{AletheXS} $i$. & \ctxsep & $\Gamma$ & $\bigcirc_{i=1}^{n} t_i ≈ ( t_1 \circ \cdots \circ ( t_{n-2} \circ ( t_{n-1} \circ t_n)\dots)$ & \currule \\ @@ -1527,9 +1529,6 @@ constants are unfolded during proof printing. Hence, the slightly strange form and the reordering of equalities. \end{RuleDescription} -\endinput - -% TODO: double sided -\subject[sec:alethe:rules-index]{Rule Index} -\placeruleIndex[textstyle={\ss\addff{table}},style={\bf\WORDS}] - +\clearpage +\subsection{Index of Rules} +\printindex[rules] diff --git a/spec/changelog.tex b/spec/changelog.tex index 1b1c345502867cbc2a2fe2042a5db509d9720315..77fdee6a94fa05453c4690adff7373b198787685 100644 --- a/spec/changelog.tex +++ b/spec/changelog.tex @@ -16,7 +16,7 @@ proofs must be able to ignore such extra annotations. List of rules: \begin{itemize} \item Improve description of \proofRule{sko_ex}. - \item Add \proofRule{hole} rule to allow holes. A proof that contains + \item Add {\proofRule{hole}} rule to allow holes. A proof that contains steps that use this rule is not valid. \end{itemize} \noindent @@ -36,7 +36,7 @@ Clarifications: \end{itemize} -\subsection*{0.1 --- \DTMdisplaydate{2021}{07}{10}{-1}} +\subsection*{0.1 -- \DTMdisplaydate{2021}{07}{10}{-1}} This is the first public release of this document. It coincides with the seventh PxTP Workshop. diff --git a/spec/publications.bib b/spec/publications.bib index 4dca1ed0cd0b9f83a7631e2de6471f1afa8d0cc4..1c7941dfe3770d9e0f4b345f40f78c9d52751c6f 100644 --- a/spec/publications.bib +++ b/spec/publications.bib @@ -1421,7 +1421,7 @@ volume = {64}, @misc{wp:alethe, author = "{Wikipedia contributors}", -title = "Alethe (bird) --- {Wikipedia}{,} The Free Encyclopedia", +title = "Alethe (bird) -- {Wikipedia}{,} The Free Encyclopedia", year = "2022", url = "https://en.wikipedia.org/w/index.php?title=Alethe_(bird)&oldid=1064503766", note = "Online; accessed 2022-09-02" diff --git a/spec/rule_index_style.ist b/spec/rule_index_style.ist new file mode 100644 index 0000000000000000000000000000000000000000..38a1a928aa96626d810968cac1361ff64fb244b0 --- /dev/null +++ b/spec/rule_index_style.ist @@ -0,0 +1,2 @@ +item_0 "\n \\item \\microtypesetup{tracking=false}\\textsf{\\detokenize{" +delim_0 "}}\\microtypesetup{tracking=true}, " diff --git a/spec/spec.tex b/spec/spec.tex index 70b50396a43d8aaeb1bec7bc4432860f6e0b3c3d..6a3441f6902629f1187b0ec6f06d946b1f0c9f47 100644 --- a/spec/spec.tex +++ b/spec/spec.tex @@ -2,8 +2,6 @@ \usepackage{scrlayer-scrpage} -\usepackage{hyperref} -\usepackage{breakurl} \usepackage{unicode-math} \usepackage{fontsetup} @@ -22,6 +20,20 @@ \usepackage{fancyvrb} % Gives us \Verb which can be used in footnotes \usepackage{amsthm} \usepackage{thmtools} +\usepackage[nottoc,notlot,notlof]{tocbibind} + +\usepackage{imakeidx} +\makeindex +\makeindex[name=rules,options= -s rule_index_style.ist] +% We provide a command that discards the argument to the index. This +% allows us to do the sectioning of the index manually and give different +% sectin levels to the rule index and the overall index +\newcommand\indexsection[1]{} +\indexsetup{level=\indexsection,firstpagestyle=headings,noclearpage} + +% Must come after imakeidx +\usepackage{hyperref} +\usepackage{breakurl} \usepackage{tikz} \usetikzlibrary{tikzmark,positioning} @@ -128,7 +140,7 @@ % Environment for proof-rules \newcounter{ProofRuleCounter} -\newcommand\currule{\proofRule{none}} +\newcommand\currule{\textbf{ERROR}} \declaretheoremstyle[ headfont=\sffamily\bfseries,% @@ -152,6 +164,7 @@ break \NewEnviron{RuleDescription}[1]{% \renewcommand\currule{\proofRule{#1}} +\index[rules]{#1} \begin{inner-rule}[\detokenize{#1}]\label{rule:#1} @@ -507,7 +520,7 @@ where the term $t$\, is the original term, and $u$ is the term after preprocessing. Tautologies with contexts correspond to judgments $\vDash_T \subst(\Gamma)(t) ≈ u$. -Formally, the context can be translated to \index{abstraction+lambda}λ-abstractions and +Formally, the context can be translated to \index{abstraction!lambda}λ-abstractions and applications. This is discussed in Section~\ref{sec:alethe:semantic}. @@ -713,7 +726,7 @@ The abstract notation denotes subproofs by marking them with a vertical line. To map this notation to a list of commands, Alethe \index{anchor}uses the \inlineAlethe{anchor} command. This command indicates the start of a subproof. A subproof is concluded by a matching \inlineAlethe{step} command. This step must use -a \index{rule+concluding}{\em concluding rule} +a \index{rule!concluding}{\em concluding rule} (such as \proofRule{subproof}, \proofRule{bind}, and so forth). After the \inlineAlethe{anchor} command, the proof uses \inlineAlethe{assume} commands to list @@ -924,7 +937,7 @@ the calculation of the context of the steps in the subproof. a step that uses a concluding rule. \end{itemize} Then $[C_{\mathit{start}}, \dots, C_{\mathit{end}}]$ is the - \index{subproof+first-innermost}first-innermost subproof of $P$. + \index{subproof!first-innermost}first-innermost subproof of $P$. \end{definition} \begin{example} @@ -948,7 +961,7 @@ It is easy to calculate the context of the first-innermost subproof. For $\mathit{start} \leq i < \mathit{end}$, let $A_1, \dots, A_m$ be the anchors among $C_1, \dots, C_{i-1}$. - The \index{context+calculated}calculated context of $C_i$ is the context + The \index{context!calculated}calculated context of $C_i$ is the context \[ c_{1,1}, \dots, c_{1, n_1}, \dots, c_{m,1}, \dots, c_{m, n_m} \] @@ -981,7 +994,7 @@ Section~\ref{apx:rules}. \begin{definition}[Valid First-Innermost Subproof] Let $[C_{\mathit{start}}, \dots, C_{\mathit{end}}]$ be the first-innermost subproof of $P$. - The subproof is \index{subproof+valid}{\em valid} if + The subproof is \index{subproof!valid}{\em valid} if \begin{itemize} \item all steps $C_i$ with $\mathit{start} < i < \mathit{end}$ only use premises $C_j$ with $\mathit{start} < @@ -1043,13 +1056,13 @@ Since this proof contains no subproof, it is also $P_{\mathit{last}}$. \begin{definition}[Well-Formed Proof] \label{def:well_formed_proof} - The Alethe proof $P$ is \index{proof+well-formed}well-formed + The Alethe proof $P$ is \index{proof!well-formed}well-formed if every step uses a unique index and $P_{\mathit{last}}$ contains no anchor or step that uses a concluding rule. \end{definition} \begin{definition}[Valid Alethe Proof] - The proof $P$ is a \index{proof+valid}{\em valid Alethe proof} if + The proof $P$ is a \index{proof!valid}{\em valid Alethe proof} if \begin{itemize} \item $P$\, is well-formed, \item $P$\, does not contain any step that uses the \proofRule{hole} rule, @@ -1073,7 +1086,7 @@ contains the step \textsf{\color{SmtStepId} t7} that concludes with the empty cl \end{example} It is sometimes useful to speak about the steps that are not within a -subproof. We call such a step an \index{step+outermost}{\em outermost +subproof. We call such a step an \index{step!outermost}{\em outermost step}. In a well-formed proof those are the steps of $P_{\mathit{last}}$. @@ -1095,7 +1108,7 @@ To handle subproofs with contexts, we translate the contexts into This allows us to leverage the \index{lambda calculus}λ-calculus as an existing well-understood theory of \index{binder}binders. % -These λ-terms\index{term+lambda} are called \index{term+meta}\index{metaterms}{\em metaterms}. +These λ-terms\index{term!lambda} are called \index{term!meta}\index{metaterms}{\em metaterms}. \begin{definition}[Metaterm] Metaterms are expressions constructed by the grammar @@ -1108,7 +1121,7 @@ all $0 \leq i \leq 1$. \end{definition} According to this definition, a metaterm is either a boxed term, a -\index{abstraction+lambda}λ-abstraction, or an application to an uncurried λ-term. +\index{abstraction!lambda}λ-abstraction, or an application to an uncurried λ-term. The annotation $\groundbox{$t$}$ delimits terms from the context, a simple λ-abstraction is used to express fixed variables, and the application expresses simulations substitution of $n$ terms.\footnote{ @@ -1443,7 +1456,7 @@ Theorem~\ref{thm:sound}. \end{proof} -\section{The Alethe Rules} +\section{Core Concepts of the Alethe Rules} \label{sec:alethe:rules-generic} Together with the language, the Alethe format also includes a set @@ -1454,7 +1467,7 @@ proof rules. Currently, the proof rules correspond to the rules that the solver {\verit} can emit. For the rest of this section, we will discuss some general concepts related to the rules. -\paragraph{Tautologous Rules and Simple Deduction.} +\subsection{Tautologous Rules and Simple Deduction} Most rules introduce tautologies. One example is the \proofRule{and_pos} rule: $\neg (\varphi_1 \land \varphi_2 \land \dots \land \varphi_n), \varphi_i$. @@ -1467,7 +1480,7 @@ rule eliminates an implication: From $\varphi_1 → \varphi_2$, it deduces $\neg \varphi_1, \varphi_2$. -\paragraph{Resolution.} +\subsection{Resolution.} {\cdclt}-based SMT solvers, and especially their SAT solvers, are fundamentally based on resolution of clauses. Hence, Alethe also has dedicated clauses and a resolution proof @@ -1494,7 +1507,8 @@ The premises of a resolution step are clauses, and the conclusion is a clause that has been derived from the premises by some binary resolution steps. -\paragraph[reference=rule:forall_inst,title={Quantifier Instantiation.}] +\subsection{Quantifier Instantiation} +\label{reference=rule:forall_inst} To express quantifier instantiation, the rule \proofRule{forall_inst} is used. It produces a formula of the form $(\neg \forall \bar x_n.\,\varphi) \lor \varphi[\bar t_n]$, where $\varphi$ is @@ -1511,7 +1525,7 @@ equalities obscures which terms have been used as instances. Existential quantifiers are handled by skolemization. -\paragraph{Linear Arithmetic.} +\subsection{Linear Arithmetic} Proofs for linear arithmetic use a number of straightforward rules, such as \proofRule{la_totality} ($t_1 \leq t_2 \lor t_2 \leq t_1$)\footnote{ This rule also has a unit clause with a disjunction as its conclusion.} @@ -1542,7 +1556,7 @@ of $(x+y<1) \lor$ $(3<x)$, $x≈ 2$, and $0≈ y$. \end{Alethe} \end{example} -\paragraph{Skolemization and Other Preprocessing Steps.} +\subsection{Skolemization and Other Preprocessing Steps} One typical example for a rule with context is the \proofRule{sko_ex} rule that is used to express skolemization of an existentially quantified variable. @@ -1584,15 +1598,21 @@ is functional congruence, and \proofRule{sko_forall} works like \end{AletheS} \end{example} -\section{Changelog} +\section{The Alethe Rules} +\label{apx:rules} +\input{alethe_rules} + +\clearpage +\section*{Changelog} \label{sec:rules} +\addcontentsline{toc}{section}{Changelog} \input{changelog} -\section{List of Rules} -\label{apx:rule} -\input{alethe_rules} +\clearpage +\section*{Index} +\addcontentsline{toc}{section}{Index} +\printindex -\section{Bibliography} \bibliographystyle{plain} \bibliography{publications} \end{document}