diff --git a/.gitignore b/.gitignore index 194387bce4623f21a38485d2643f49d60b20921d..3ffcffd18ca31756386647b80ee43fdd53340476 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,5 @@ _minted-comments/ *.log *.out *.pdf +*.pag *.toc diff --git a/publications/pxtp21/_minted-extended_abstract/default-pyg-prefix.pygstyle b/publications/pxtp21/_minted-extended_abstract/default-pyg-prefix.pygstyle new file mode 100644 index 0000000000000000000000000000000000000000..cd0f51ac14bc0245adbc1b7a69a2d395b97b924d --- /dev/null +++ b/publications/pxtp21/_minted-extended_abstract/default-pyg-prefix.pygstyle @@ -0,0 +1,101 @@ + +\makeatletter +\def\PYG@reset{\let\PYG@it=\relax \let\PYG@bf=\relax% + \let\PYG@ul=\relax \let\PYG@tc=\relax% + \let\PYG@bc=\relax \let\PYG@ff=\relax} +\def\PYG@tok#1{\csname PYG@tok@#1\endcsname} +\def\PYG@toks#1+{\ifx\relax#1\empty\else% + \PYG@tok{#1}\expandafter\PYG@toks\fi} +\def\PYG@do#1{\PYG@bc{\PYG@tc{\PYG@ul{% + \PYG@it{\PYG@bf{\PYG@ff{#1}}}}}}} +\def\PYG#1#2{\PYG@reset\PYG@toks#1+\relax+\PYG@do{#2}} + +\expandafter\def\csname PYG@tok@w\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.73,0.73}{##1}}} +\expandafter\def\csname PYG@tok@c\endcsname{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PYG@tok@cp\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.74,0.48,0.00}{##1}}} +\expandafter\def\csname PYG@tok@k\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PYG@tok@kp\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PYG@tok@kt\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.69,0.00,0.25}{##1}}} +\expandafter\def\csname PYG@tok@o\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PYG@tok@ow\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}} +\expandafter\def\csname PYG@tok@nb\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PYG@tok@nf\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PYG@tok@nc\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PYG@tok@nn\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PYG@tok@ne\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.82,0.25,0.23}{##1}}} +\expandafter\def\csname PYG@tok@nv\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PYG@tok@no\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.53,0.00,0.00}{##1}}} +\expandafter\def\csname PYG@tok@nl\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.63,0.63,0.00}{##1}}} +\expandafter\def\csname PYG@tok@ni\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.60,0.60,0.60}{##1}}} +\expandafter\def\csname PYG@tok@na\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.49,0.56,0.16}{##1}}} +\expandafter\def\csname PYG@tok@nt\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PYG@tok@nd\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}} +\expandafter\def\csname PYG@tok@s\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PYG@tok@sd\endcsname{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PYG@tok@si\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}} +\expandafter\def\csname PYG@tok@se\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.73,0.40,0.13}{##1}}} +\expandafter\def\csname PYG@tok@sr\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}} +\expandafter\def\csname PYG@tok@ss\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PYG@tok@sx\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PYG@tok@m\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PYG@tok@gh\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}} +\expandafter\def\csname PYG@tok@gu\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.50,0.00,0.50}{##1}}} +\expandafter\def\csname PYG@tok@gd\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.63,0.00,0.00}{##1}}} +\expandafter\def\csname PYG@tok@gi\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.63,0.00}{##1}}} +\expandafter\def\csname PYG@tok@gr\endcsname{\def\PYG@tc##1{\textcolor[rgb]{1.00,0.00,0.00}{##1}}} +\expandafter\def\csname PYG@tok@ge\endcsname{\let\PYG@it=\textit} +\expandafter\def\csname PYG@tok@gs\endcsname{\let\PYG@bf=\textbf} +\expandafter\def\csname PYG@tok@gp\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}} +\expandafter\def\csname PYG@tok@go\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.53,0.53,0.53}{##1}}} +\expandafter\def\csname PYG@tok@gt\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.27,0.87}{##1}}} +\expandafter\def\csname PYG@tok@err\endcsname{\def\PYG@bc##1{\setlength{\fboxsep}{0pt}\fcolorbox[rgb]{1.00,0.00,0.00}{1,1,1}{\strut ##1}}} +\expandafter\def\csname PYG@tok@kc\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PYG@tok@kd\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PYG@tok@kn\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PYG@tok@kr\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PYG@tok@bp\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PYG@tok@fm\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PYG@tok@vc\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PYG@tok@vg\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PYG@tok@vi\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PYG@tok@vm\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PYG@tok@sa\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PYG@tok@sb\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PYG@tok@sc\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PYG@tok@dl\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PYG@tok@s2\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PYG@tok@sh\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PYG@tok@s1\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PYG@tok@mb\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PYG@tok@mf\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PYG@tok@mh\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PYG@tok@mi\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PYG@tok@il\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PYG@tok@mo\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PYG@tok@ch\endcsname{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PYG@tok@cm\endcsname{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PYG@tok@cpf\endcsname{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PYG@tok@c1\endcsname{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PYG@tok@cs\endcsname{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} + +\def\PYGZbs{\char`\\} +\def\PYGZus{\char`\_} +\def\PYGZob{\char`\{} +\def\PYGZcb{\char`\}} +\def\PYGZca{\char`\^} +\def\PYGZam{\char`\&} +\def\PYGZlt{\char`\<} +\def\PYGZgt{\char`\>} +\def\PYGZsh{\char`\#} +\def\PYGZpc{\char`\%} +\def\PYGZdl{\char`\$} +\def\PYGZhy{\char`\-} +\def\PYGZsq{\char`\'} +\def\PYGZdq{\char`\"} +\def\PYGZti{\char`\~} +% for compatibility with earlier versions +\def\PYGZat{@} +\def\PYGZlb{[} +\def\PYGZrb{]} +\makeatother + diff --git a/publications/pxtp21/_minted-extended_abstract/listing1.pygtex b/publications/pxtp21/_minted-extended_abstract/listing1.pygtex new file mode 100644 index 0000000000000000000000000000000000000000..f1a40c39fb1610a11879a889da21ae17050b92dd --- /dev/null +++ b/publications/pxtp21/_minted-extended_abstract/listing1.pygtex @@ -0,0 +1,19 @@ +\begin{Verbatim}[commandchars=\\\{\}] + \PYG{p}{(}\PYG{k+kr}{assume} \PYG{n+nv}{a0} \PYG{p}{(}\PYG{n+nb}{exists }\PYG{p}{((}\PYG{n+nv}{x} \PYG{n+nv}{A}\PYG{p}{))} \PYG{p}{(}\PYG{n+nv}{f} \PYG{n+nv}{x}\PYG{p}{)))} + \PYG{p}{(}\PYG{k+kr}{anchor} \PYG{n+nf}{:step} \PYG{n+nv}{t1} \PYG{n+nf}{:args} \PYG{p}{(}\PYG{n+nb}{:= }\PYG{n+nv}{x} \PYG{n+nv}{vr}\PYG{p}{))} + \PYG{p}{(}\PYG{k+kr}{step} \PYG{n+nv}{t1.t1} \PYG{p}{(}\PYG{n+nb}{cl }\PYG{p}{(}\PYG{n+nb}{= }\PYG{n+nv}{x} \PYG{n+nv}{vr}\PYG{p}{))} \PYG{n+nf}{:rule} \PYG{n+nv}{cong}\PYG{p}{)} + \PYG{p}{(}\PYG{k+kr}{step} \PYG{n+nv}{t1.t2} \PYG{p}{(}\PYG{n+nb}{cl }\PYG{p}{(}\PYG{n+nb}{= }\PYG{p}{(}\PYG{n+nv}{f} \PYG{n+nv}{x}\PYG{p}{)} \PYG{p}{(}\PYG{n+nv}{f} \PYG{n+nv}{vr}\PYG{p}{)))} \PYG{n+nf}{:rule} \PYG{n+nv}{cong}\PYG{p}{)} + \PYG{p}{(}\PYG{k+kr}{step} \PYG{n+nv}{t1} \PYG{p}{(}\PYG{n+nb}{cl }\PYG{p}{(}\PYG{n+nb}{= }\PYG{p}{(}\PYG{n+nb}{exists }\PYG{p}{((}\PYG{n+nv}{x} \PYG{n+nv}{A}\PYG{p}{))} \PYG{p}{(}\PYG{n+nv}{f} \PYG{n+nv}{x}\PYG{p}{))} + \PYG{p}{(}\PYG{n+nb}{exists }\PYG{p}{((}\PYG{n+nv}{vr} \PYG{n+nv}{A}\PYG{p}{))} \PYG{p}{(}\PYG{n+nv}{f} \PYG{n+nv}{vr}\PYG{p}{))))} \PYG{n+nf}{:rule} \PYG{n+nv}{bind}\PYG{p}{)} + \PYG{p}{(}\PYG{k+kr}{step} \PYG{n+nv}{t2} \PYG{p}{(}\PYG{n+nb}{cl }\PYG{p}{(}\PYG{n+nb}{not }\PYG{p}{(}\PYG{n+nb}{= }\PYG{p}{(}\PYG{n+nb}{exists }\PYG{p}{((}\PYG{n+nv}{vr} \PYG{n+nv}{A}\PYG{p}{))} \PYG{p}{(}\PYG{n+nv}{f} \PYG{n+nv}{x}\PYG{p}{))} + \PYG{p}{(}\PYG{n+nb}{exists }\PYG{p}{((}\PYG{n+nv}{vr} \PYG{n+nv}{A}\PYG{p}{))} \PYG{p}{(}\PYG{n+nv}{f} \PYG{n+nv}{vr}\PYG{p}{))))} + \PYG{p}{(}\PYG{n+nb}{not }\PYG{p}{(}\PYG{n+nb}{exists }\PYG{p}{((}\PYG{n+nv}{vr} \PYG{n+nv}{A}\PYG{p}{))} \PYG{p}{(}\PYG{n+nv}{f} \PYG{n+nv}{x}\PYG{p}{)))} + \PYG{p}{(}\PYG{n+nb}{exists }\PYG{p}{((}\PYG{n+nv}{vr} \PYG{n+nv}{A}\PYG{p}{))} \PYG{p}{(}\PYG{n+nv}{f} \PYG{n+nv}{vr}\PYG{p}{)))} \PYG{n+nf}{:rule} \PYG{n+nv}{equiv\PYGZus{}pos1}\PYG{p}{)} + \PYG{p}{(}\PYG{k+kr}{step} \PYG{n+nv}{t3} \PYG{p}{(}\PYG{n+nb}{cl }\PYG{p}{(}\PYG{n+nb}{exists }\PYG{p}{((}\PYG{n+nv}{vr} \PYG{n+nv}{A}\PYG{p}{))} \PYG{p}{(}\PYG{n+nv}{f} \PYG{n+nv}{vr}\PYG{p}{)))} \PYG{n+nf}{:premises} \PYG{p}{(}\PYG{n+nv}{a0} \PYG{n+nv}{t1} \PYG{n+nv}{t2}\PYG{p}{)} \PYG{n+nf}{:rule} \PYG{n+nv}{resolution}\PYG{p}{)} + \PYG{p}{(}\PYG{k+kr}{define\PYGZhy{}fun} \PYG{n+nv}{X} \PYG{p}{()} \PYG{n+nv}{A} \PYG{p}{(}\PYG{n+nv}{choice} \PYG{p}{((}\PYG{n+nv}{vr} \PYG{n+nv}{A}\PYG{p}{))} \PYG{p}{(}\PYG{n+nv}{f} \PYG{n+nv}{vr}\PYG{p}{)))} + \PYG{p}{(}\PYG{k+kr}{step} \PYG{n+nv}{t4} \PYG{p}{(}\PYG{n+nb}{cl }\PYG{p}{(}\PYG{n+nb}{= }\PYG{p}{(}\PYG{n+nb}{exists }\PYG{p}{((}\PYG{n+nv}{vr} \PYG{n+nv}{A}\PYG{p}{))} \PYG{p}{(}\PYG{n+nv}{f} \PYG{n+nv}{vr}\PYG{p}{))} \PYG{p}{(}\PYG{n+nv}{f} \PYG{n+nv}{X}\PYG{p}{)))} \PYG{n+nf}{:rule} \PYG{n+nv}{sko\PYGZus{}ex}\PYG{p}{)} + \PYG{p}{(}\PYG{k+kr}{step} \PYG{n+nv}{t5} \PYG{p}{(}\PYG{n+nb}{cl }\PYG{p}{(}\PYG{n+nb}{not }\PYG{p}{(}\PYG{n+nb}{= }\PYG{p}{(}\PYG{n+nb}{exists }\PYG{p}{((}\PYG{n+nv}{vr} \PYG{n+nv}{A}\PYG{p}{))} \PYG{p}{(}\PYG{n+nv}{f} \PYG{n+nv}{vr}\PYG{p}{))} \PYG{p}{(}\PYG{n+nv}{f} \PYG{n+nv}{X}\PYG{p}{)))} + \PYG{p}{(}\PYG{n+nb}{not }\PYG{p}{(}\PYG{n+nb}{exists }\PYG{p}{((}\PYG{n+nv}{vr} \PYG{n+nv}{A}\PYG{p}{))} \PYG{p}{(}\PYG{n+nv}{f} \PYG{n+nv}{vr}\PYG{p}{)))} + \PYG{p}{(}\PYG{n+nv}{f} \PYG{n+nv}{X}\PYG{p}{))} \PYG{n+nf}{:rule} \PYG{n+nv}{equiv\PYGZus{}pos1}\PYG{p}{)} + \PYG{p}{(}\PYG{k+kr}{step} \PYG{n+nv}{t6} \PYG{p}{(}\PYG{n+nb}{cl }\PYG{p}{(}\PYG{n+nv}{f} \PYG{n+nv}{X}\PYG{p}{))} \PYG{n+nf}{:premises} \PYG{p}{(}\PYG{n+nv}{t3} \PYG{n+nv}{t4} \PYG{n+nv}{t5}\PYG{p}{)} \PYG{n+nf}{:rule} \PYG{n+nv}{resolution}\PYG{p}{)} +\end{Verbatim} diff --git a/publications/pxtp21/_minted-extended_abstract/trac.pygstyle b/publications/pxtp21/_minted-extended_abstract/trac.pygstyle new file mode 100644 index 0000000000000000000000000000000000000000..85929ff13f12724880889cf52f61700fb9facd0a --- /dev/null +++ b/publications/pxtp21/_minted-extended_abstract/trac.pygstyle @@ -0,0 +1,99 @@ + +\makeatletter +\def\PYGtrac@reset{\let\PYGtrac@it=\relax \let\PYGtrac@bf=\relax% + \let\PYGtrac@ul=\relax \let\PYGtrac@tc=\relax% + \let\PYGtrac@bc=\relax \let\PYGtrac@ff=\relax} +\def\PYGtrac@tok#1{\csname PYGtrac@tok@#1\endcsname} +\def\PYGtrac@toks#1+{\ifx\relax#1\empty\else% + \PYGtrac@tok{#1}\expandafter\PYGtrac@toks\fi} +\def\PYGtrac@do#1{\PYGtrac@bc{\PYGtrac@tc{\PYGtrac@ul{% + \PYGtrac@it{\PYGtrac@bf{\PYGtrac@ff{#1}}}}}}} +\def\PYGtrac#1#2{\PYGtrac@reset\PYGtrac@toks#1+\relax+\PYGtrac@do{#2}} + +\expandafter\def\csname PYGtrac@tok@w\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.73,0.73,0.73}{##1}}} +\expandafter\def\csname PYGtrac@tok@c\endcsname{\let\PYGtrac@it=\textit\def\PYGtrac@tc##1{\textcolor[rgb]{0.60,0.60,0.53}{##1}}} +\expandafter\def\csname PYGtrac@tok@cp\endcsname{\let\PYGtrac@bf=\textbf\def\PYGtrac@tc##1{\textcolor[rgb]{0.60,0.60,0.60}{##1}}} +\expandafter\def\csname PYGtrac@tok@cs\endcsname{\let\PYGtrac@bf=\textbf\let\PYGtrac@it=\textit\def\PYGtrac@tc##1{\textcolor[rgb]{0.60,0.60,0.60}{##1}}} +\expandafter\def\csname PYGtrac@tok@o\endcsname{\let\PYGtrac@bf=\textbf} +\expandafter\def\csname PYGtrac@tok@s\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.73,0.53,0.27}{##1}}} +\expandafter\def\csname PYGtrac@tok@sr\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.50,0.50,0.00}{##1}}} +\expandafter\def\csname PYGtrac@tok@m\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.00,0.60,0.60}{##1}}} +\expandafter\def\csname PYGtrac@tok@k\endcsname{\let\PYGtrac@bf=\textbf} +\expandafter\def\csname PYGtrac@tok@kt\endcsname{\let\PYGtrac@bf=\textbf\def\PYGtrac@tc##1{\textcolor[rgb]{0.27,0.33,0.53}{##1}}} +\expandafter\def\csname PYGtrac@tok@nb\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.60,0.60,0.60}{##1}}} +\expandafter\def\csname PYGtrac@tok@nf\endcsname{\let\PYGtrac@bf=\textbf\def\PYGtrac@tc##1{\textcolor[rgb]{0.60,0.00,0.00}{##1}}} +\expandafter\def\csname PYGtrac@tok@nc\endcsname{\let\PYGtrac@bf=\textbf\def\PYGtrac@tc##1{\textcolor[rgb]{0.27,0.33,0.53}{##1}}} +\expandafter\def\csname PYGtrac@tok@ne\endcsname{\let\PYGtrac@bf=\textbf\def\PYGtrac@tc##1{\textcolor[rgb]{0.60,0.00,0.00}{##1}}} +\expandafter\def\csname PYGtrac@tok@nn\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.33,0.33,0.33}{##1}}} +\expandafter\def\csname PYGtrac@tok@nv\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.00,0.50,0.50}{##1}}} +\expandafter\def\csname PYGtrac@tok@no\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.00,0.50,0.50}{##1}}} +\expandafter\def\csname PYGtrac@tok@nt\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}} +\expandafter\def\csname PYGtrac@tok@na\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.00,0.50,0.50}{##1}}} +\expandafter\def\csname PYGtrac@tok@ni\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.50,0.00,0.50}{##1}}} +\expandafter\def\csname PYGtrac@tok@gh\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.60,0.60,0.60}{##1}}} +\expandafter\def\csname PYGtrac@tok@gu\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.67,0.67,0.67}{##1}}} +\expandafter\def\csname PYGtrac@tok@gd\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.00,0.00,0.00}{##1}}\def\PYGtrac@bc##1{\setlength{\fboxsep}{0pt}\colorbox[rgb]{1.00,0.87,0.87}{\strut ##1}}} +\expandafter\def\csname PYGtrac@tok@gi\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.00,0.00,0.00}{##1}}\def\PYGtrac@bc##1{\setlength{\fboxsep}{0pt}\colorbox[rgb]{0.87,1.00,0.87}{\strut ##1}}} +\expandafter\def\csname PYGtrac@tok@gr\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.67,0.00,0.00}{##1}}} +\expandafter\def\csname PYGtrac@tok@ge\endcsname{\let\PYGtrac@it=\textit} +\expandafter\def\csname PYGtrac@tok@gs\endcsname{\let\PYGtrac@bf=\textbf} +\expandafter\def\csname PYGtrac@tok@gp\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.33,0.33,0.33}{##1}}} +\expandafter\def\csname PYGtrac@tok@go\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.53,0.53,0.53}{##1}}} +\expandafter\def\csname PYGtrac@tok@gt\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.67,0.00,0.00}{##1}}} +\expandafter\def\csname PYGtrac@tok@err\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.65,0.09,0.09}{##1}}\def\PYGtrac@bc##1{\setlength{\fboxsep}{0pt}\colorbox[rgb]{0.89,0.82,0.82}{\strut ##1}}} +\expandafter\def\csname PYGtrac@tok@kc\endcsname{\let\PYGtrac@bf=\textbf} +\expandafter\def\csname PYGtrac@tok@kd\endcsname{\let\PYGtrac@bf=\textbf} +\expandafter\def\csname PYGtrac@tok@kn\endcsname{\let\PYGtrac@bf=\textbf} +\expandafter\def\csname PYGtrac@tok@kp\endcsname{\let\PYGtrac@bf=\textbf} +\expandafter\def\csname PYGtrac@tok@kr\endcsname{\let\PYGtrac@bf=\textbf} +\expandafter\def\csname PYGtrac@tok@bp\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.60,0.60,0.60}{##1}}} +\expandafter\def\csname PYGtrac@tok@fm\endcsname{\let\PYGtrac@bf=\textbf\def\PYGtrac@tc##1{\textcolor[rgb]{0.60,0.00,0.00}{##1}}} +\expandafter\def\csname PYGtrac@tok@vc\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.00,0.50,0.50}{##1}}} +\expandafter\def\csname PYGtrac@tok@vg\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.00,0.50,0.50}{##1}}} +\expandafter\def\csname PYGtrac@tok@vi\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.00,0.50,0.50}{##1}}} +\expandafter\def\csname PYGtrac@tok@vm\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.00,0.50,0.50}{##1}}} +\expandafter\def\csname PYGtrac@tok@sa\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.73,0.53,0.27}{##1}}} +\expandafter\def\csname PYGtrac@tok@sb\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.73,0.53,0.27}{##1}}} +\expandafter\def\csname PYGtrac@tok@sc\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.73,0.53,0.27}{##1}}} +\expandafter\def\csname PYGtrac@tok@dl\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.73,0.53,0.27}{##1}}} +\expandafter\def\csname PYGtrac@tok@sd\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.73,0.53,0.27}{##1}}} +\expandafter\def\csname PYGtrac@tok@s2\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.73,0.53,0.27}{##1}}} +\expandafter\def\csname PYGtrac@tok@se\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.73,0.53,0.27}{##1}}} +\expandafter\def\csname PYGtrac@tok@sh\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.73,0.53,0.27}{##1}}} +\expandafter\def\csname PYGtrac@tok@si\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.73,0.53,0.27}{##1}}} +\expandafter\def\csname PYGtrac@tok@sx\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.73,0.53,0.27}{##1}}} +\expandafter\def\csname PYGtrac@tok@s1\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.73,0.53,0.27}{##1}}} +\expandafter\def\csname PYGtrac@tok@ss\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.73,0.53,0.27}{##1}}} +\expandafter\def\csname PYGtrac@tok@mb\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.00,0.60,0.60}{##1}}} +\expandafter\def\csname PYGtrac@tok@mf\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.00,0.60,0.60}{##1}}} +\expandafter\def\csname PYGtrac@tok@mh\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.00,0.60,0.60}{##1}}} +\expandafter\def\csname PYGtrac@tok@mi\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.00,0.60,0.60}{##1}}} +\expandafter\def\csname PYGtrac@tok@il\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.00,0.60,0.60}{##1}}} +\expandafter\def\csname PYGtrac@tok@mo\endcsname{\def\PYGtrac@tc##1{\textcolor[rgb]{0.00,0.60,0.60}{##1}}} +\expandafter\def\csname PYGtrac@tok@ow\endcsname{\let\PYGtrac@bf=\textbf} +\expandafter\def\csname PYGtrac@tok@ch\endcsname{\let\PYGtrac@it=\textit\def\PYGtrac@tc##1{\textcolor[rgb]{0.60,0.60,0.53}{##1}}} +\expandafter\def\csname PYGtrac@tok@cm\endcsname{\let\PYGtrac@it=\textit\def\PYGtrac@tc##1{\textcolor[rgb]{0.60,0.60,0.53}{##1}}} +\expandafter\def\csname PYGtrac@tok@cpf\endcsname{\let\PYGtrac@it=\textit\def\PYGtrac@tc##1{\textcolor[rgb]{0.60,0.60,0.53}{##1}}} +\expandafter\def\csname PYGtrac@tok@c1\endcsname{\let\PYGtrac@it=\textit\def\PYGtrac@tc##1{\textcolor[rgb]{0.60,0.60,0.53}{##1}}} + +\def\PYGtracZbs{\char`\\} +\def\PYGtracZus{\char`\_} +\def\PYGtracZob{\char`\{} +\def\PYGtracZcb{\char`\}} +\def\PYGtracZca{\char`\^} +\def\PYGtracZam{\char`\&} +\def\PYGtracZlt{\char`\<} +\def\PYGtracZgt{\char`\>} +\def\PYGtracZsh{\char`\#} +\def\PYGtracZpc{\char`\%} +\def\PYGtracZdl{\char`\$} +\def\PYGtracZhy{\char`\-} +\def\PYGtracZsq{\char`\'} +\def\PYGtracZdq{\char`\"} +\def\PYGtracZti{\char`\~} +% for compatibility with earlier versions +\def\PYGtracZat{@} +\def\PYGtracZlb{[} +\def\PYGtracZrb{]} +\makeatother + diff --git a/publications/pxtp21/abstract b/publications/pxtp21/abstract new file mode 100644 index 0000000000000000000000000000000000000000..db7a43200470027feab57d682e78d5673bf9df43 --- /dev/null +++ b/publications/pxtp21/abstract @@ -0,0 +1,13 @@ +PxTP-7 + +Beyond veriT: Towards a Generic SMT Proof Format (Extended Abstract) + +The first iteration of the proof format used by veriT was presented ten +years ago at the first PxTP workshop in 2011. Since then the format +has matured, and proofs generated by veriT are used withing multiple +applications. Indeed, it is quickly growing beyond the confinements +of one singular prover. We review the challenges we encountered with +using the format in practice, and also discuss the likely problems that +will arise when another solver will use the format. We also present +our work on a specification for the format. + diff --git a/publications/pxtp21/breakurl.sty b/publications/pxtp21/breakurl.sty new file mode 100644 index 0000000000000000000000000000000000000000..0bf5b06e8fe39fb3f1e2a8179bb69c9281aaf38d --- /dev/null +++ b/publications/pxtp21/breakurl.sty @@ -0,0 +1,309 @@ +%% +%% This is file `breakurl.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% breakurl.dtx (with options: `package') +%% +%% This is a generated file. +%% +%% Copyright (C) 2005 by Vilar Camara Neto. +%% +%% This file may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either +%% version 1.2 of this license or (at your option) any later +%% version. The latest version of this license is in: +%% +%% http://www.latex-project.org/lppl.txt +%% +%% and version 1.2 or later is part of all distributions of +%% LaTeX version 1999/12/01 or later. +%% +%% Currently this work has the LPPL maintenance status "maintained". +%% +%% The Current Maintainer of this work is Vilar Camara Neto. +%% +%% This work consists of the files breakurl.dtx and +%% breakurl.ins and the derived file breakurl.sty. +%% +\NeedsTeXFormat{LaTeX2e}[1999/12/01] +\ProvidesPackage{breakurl} + [2009/01/24 v1.30 Breakable hyperref URLs] + + +\RequirePackage{xkeyval} +\RequirePackage{ifpdf} + +\ifpdf + % Dummy package options + \DeclareOptionX{preserveurlmacro}{} + \DeclareOptionX{hyphenbreaks}{} + \DeclareOptionX{vertfit}{} + \ProcessOptionsX\relax + + \PackageWarning{breakurl}{% + You are using breakurl while processing via pdflatex.\MessageBreak + \string\burl\space will be just a synonym of \string\url.\MessageBreak} + \DeclareRobustCommand{\burl}{\url} + \DeclareRobustCommand*{\burlalt}{\hyper@normalise\burl@alt} + \def\burl@alt#1#2{\hyper@linkurl{\Hurl{#1}}{#2}} + \expandafter\endinput +\fi + +\@ifpackageloaded{hyperref}{}{% + \PackageError{breakurl}{The breakurl depends on hyperref package}% + {I can't do anything. Please type X <return>, edit the source file% + \MessageBreak + and add \string\usepackage\string{hyperref\string} before + \string\usepackage\string{breakurl\string}.} + \endinput +} + +\newif\if@preserveurlmacro\@preserveurlmacrofalse +\newif\if@burl@fitstrut\@burl@fitstrutfalse +\newif\if@burl@fitglobal\@burl@fitglobalfalse + +\newtoks\burl@toks + +\let\burl@charlistbefore\empty +\let\burl@charlistafter\empty + +\def\burl@addtocharlistbefore{\g@addto@macro\burl@charlistbefore} +\def\burl@addtocharlistafter{\g@addto@macro\burl@charlistafter} + +\bgroup + \catcode`\&=12\relax + \hyper@normalise\burl@addtocharlistbefore{%} + \hyper@normalise\burl@addtocharlistafter{:/.?#&_,;!} +\egroup + +\def\burl@growmif#1#2{% + \g@addto@macro\burl@mif{\def\burl@ttt{#1}\ifx\burl@ttt\@nextchar#2\else}% +} +\def\burl@growmfi{% + \g@addto@macro\burl@mfi{\fi}% +} +\def\burl@defifstructure{% + \let\burl@mif\empty + \let\burl@mfi\empty + \expandafter\@tfor\expandafter\@nextchar\expandafter:\expandafter=% + \burl@charlistbefore\do{% + \expandafter\burl@growmif\@nextchar\@burl@breakbeforetrue + \burl@growmfi + }% + \expandafter\@tfor\expandafter\@nextchar\expandafter:\expandafter=% + \burl@charlistafter\do{% + \expandafter\burl@growmif\@nextchar\@burl@breakaftertrue + \burl@growmfi + }% +} + +\AtEndOfPackage{\burl@defifstructure} + +\def\burl@setvertfit#1{% + \lowercase{\def\burl@temp{#1}}% + \def\burl@opt{local}\ifx\burl@temp\burl@opt + \@burl@fitstrutfalse\@burl@fitglobalfalse + \else\def\burl@opt{strut}\ifx\burl@temp\burl@opt + \@burl@fitstruttrue\@burl@fitglobalfalse + \else\def\burl@opt{global}\ifx\burl@temp\burl@opt + \@burl@fitstrutfalse\@burl@fitglobaltrue + \else + \PackageWarning{breakurl}{Unrecognized vertfit option `\burl@temp'.% + \MessageBreak + Adopting default `local'} + \@burl@fitstrutfalse\@burl@fitglobalfalse + \fi\fi\fi +} + +\DeclareOptionX{preserveurlmacro}{\@preserveurlmacrotrue} +\DeclareOptionX{hyphenbreaks}{% + \bgroup + \catcode`\&=12\relax + \hyper@normalise\burl@addtocharlistafter{-}% + \egroup +} +\DeclareOptionX{vertfit}[local]{\burl@setvertfit{#1}} + +\ProcessOptionsX\relax + +\def\burl@hyper@linkurl#1#2{% + \begingroup + \hyper@chars + \burl@condpdflink{#1}% + \endgroup +} + +\def\burl@condpdflink#1{% + \literalps@out{ + /burl@bordercolor {\@urlbordercolor} def + /burl@border {\@pdfborder} def + }% + \if@burl@fitstrut + \sbox\pdf@box{#1\strut}% + \else\if@burl@fitglobal + \sbox\pdf@box{\burl@url}% + \else + \sbox\pdf@box{#1}% + \fi\fi + \dimen@\ht\pdf@box\dimen@ii\dp\pdf@box + \sbox\pdf@box{#1}% + \ifdim\dimen@ii=\z@ + \literalps@out{BU.SS}% + \else + \lower\dimen@ii\hbox{\literalps@out{BU.SS}}% + \fi + \ifHy@breaklinks\unhbox\else\box\fi\pdf@box + \ifdim\dimen@=\z@ + \literalps@out{BU.SE}% + \else + \raise\dimen@\hbox{\literalps@out{BU.SE}}% + \fi + \pdf@addtoksx{H.B}% +} + +\DeclareRobustCommand*{\burl}{% + \leavevmode + \begingroup + \let\hyper@linkurl=\burl@hyper@linkurl + \catcode`\&=12\relax + \hyper@normalise\burl@ +} + +\DeclareRobustCommand*{\burlalt}{% + \begingroup + \let\hyper@linkurl=\burl@hyper@linkurl + \catcode`\&=12\relax + \hyper@normalise\burl@alt +} + +\newif\if@burl@breakbefore +\newif\if@burl@breakafter +\newif\if@burl@prevbreakafter + +\bgroup +\catcode`\&=12\relax +\gdef\burl@#1{% + \def\burl@url{#1}% + \def\burl@urltext{#1}% + \burl@doit +} + +\gdef\burl@alt#1{% + \def\burl@url{#1}% + \hyper@normalise\burl@@alt +} +\gdef\burl@@alt#1{% + \def\burl@urltext{#1}% + \burl@doit +} + +\gdef\burl@doit{% + \burl@toks{}% + \let\burl@UrlRight\UrlRight + \let\UrlRight\empty + \@burl@prevbreakafterfalse + \@ifundefined{@urlcolor}{\Hy@colorlink\@linkcolor}{\Hy@colorlink\@urlcolor}% + \expandafter\@tfor\expandafter\@nextchar\expandafter:\expandafter=% + \burl@urltext\do{% + \if@burl@breakafter\@burl@prevbreakaftertrue + \else\@burl@prevbreakafterfalse\fi + \@burl@breakbeforefalse + \@burl@breakafterfalse + \expandafter\burl@mif\burl@mfi + \if@burl@breakbefore + % Breakable if the current char is in the `can break before' list + \burl@flush\linebreak[0]% + \else + \if@burl@prevbreakafter + \if@burl@breakafter\else + % Breakable if the current char is not in any of the `can break' + % lists, but the previous is in the `can break after' list. + % This mechanism accounts for sequences of `break after' characters, + % where a break is allowed only after the last one + \burl@flush\linebreak[0]% + \fi + \fi + \fi + \expandafter\expandafter\expandafter\burl@toks + \expandafter\expandafter\expandafter{% + \expandafter\the\expandafter\burl@toks\@nextchar}% + }% + \let\UrlRight\burl@UrlRight + \burl@flush + \literalps@out{BU.E}% + \Hy@endcolorlink + \endgroup +} +\egroup + +\def\the@burl@toks{\the\burl@toks} + +\def\burl@flush{% + \expandafter\def\expandafter\burl@toks@def\expandafter{\the\burl@toks}% + \literalps@out{/BU.L (\burl@url) def}% + \hyper@linkurl{\expandafter\Hurl\expandafter{\burl@toks@def}}{\burl@url}% + \global\burl@toks{}% + \let\UrlLeft\empty +}% + +\if@preserveurlmacro\else\let\url\burl\let\urlalt\burlalt\fi + +\AtBeginDvi{% + \headerps@out{% + /burl@stx null def + /BU.S { + /burl@stx null def + } def + /BU.SS { + currentpoint + /burl@lly exch def + /burl@llx exch def + burl@stx null ne {burl@endx burl@llx ne {BU.FL BU.S} if} if + burl@stx null eq { + burl@llx dup /burl@stx exch def /burl@endx exch def + burl@lly dup /burl@boty exch def /burl@topy exch def + } if + burl@lly burl@boty gt {/burl@boty burl@lly def} if + } def + /BU.SE { + currentpoint + /burl@ury exch def + dup /burl@urx exch def /burl@endx exch def + burl@ury burl@topy lt {/burl@topy burl@ury def} if + } def + /BU.E { + BU.FL + } def + /BU.FL { + burl@stx null ne {BU.DF} if + } def + /BU.DF { + BU.BB + [ /H /I /Border [burl@border] /Color [burl@bordercolor] + /Action << /Subtype /URI /URI BU.L >> /Subtype /Link BU.B /ANN pdfmark + /burl@stx null def + } def + /BU.BB { + burl@stx HyperBorder sub /burl@stx exch def + burl@endx HyperBorder add /burl@endx exch def + burl@boty HyperBorder add /burl@boty exch def + burl@topy HyperBorder sub /burl@topy exch def + } def + /BU.B { + /Rect[burl@stx burl@boty burl@endx burl@topy] + } def + /eop where { + begin + /@ldeopburl /eop load def + /eop { SDict begin BU.FL end @ldeopburl } def + end + } { + /eop { SDict begin BU.FL end } def + } ifelse + }% +} +\endinput +%% +%% End of file `breakurl.sty'. diff --git a/publications/pxtp21/eptcs.bst b/publications/pxtp21/eptcs.bst new file mode 100644 index 0000000000000000000000000000000000000000..86e0e1be13e3e1880db785d3f563b0a34ec45e04 --- /dev/null +++ b/publications/pxtp21/eptcs.bst @@ -0,0 +1,1425 @@ +%% +%% This is file `eptcs.bst', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% merlin.mbs (with options: `vonx,ed-au,dt-beg,yr-par,xmth,yrp-col,tit-it,atit-u,volp-com,jwdpg,pp-last,num-xser,ser-vol,jnm-x,pre-edn,doi,blknt,pp,xedn,amper,and-xcom,etal-xc,url,url-blk,bibinfo,nfss,') +%% ---------------------------------------- +%% *** Stylefile for EPTCS *** +%% +%% Copyright 1994-2004 Patrick W Daly + % =============================================================== + % NOTICE: + % This bibliographic style (bst) file has been generated from one or + % more master bibliographic style (mbs) files, listed above. + % Subsequently it has been edited by hand by Rob van Glabbeek + % + % This file can be redistributed and/or modified under the terms + % of the LaTeX Project Public License Distributed from CTAN + % archives in directory macros/latex/base/lppl.txt; either + % version 1 of the License, or any later version. + % =============================================================== + % Name and version information of the main mbs file: + % \ProvidesFile{merlin.mbs}[2004/02/09 4.13 (PWD, AO, DPC)] + % For use with BibTeX version 0.99a or later + %------------------------------------------------------------------- + % This bibliography style file is intended for texts in ENGLISH + % This is a numerical citation style, and as such is standard LaTeX. + % It requires no extra package to interface to the main text. + % The form of the \bibitem entries is + % \bibitem{key}... + % Usage of \cite is as follows: + % \cite{key} ==>> [#] + % \cite[chap. 2]{key} ==>> [#, chap. 2] + % where # is a number determined by the ordering in the reference list. + % The order in the reference list is alphabetical by authors. + %--------------------------------------------------------------------- + +ENTRY + { address + author + booktitle + chapter + doi + edition + editor + eid + howpublished + institution + journal + key + note + number + organization + pages + publisher + school + series + title + type + url + ee + volume + year + } + {} + { label } +INTEGERS { output.state before.all mid.sentence after.sentence after.block } +FUNCTION {init.state.consts} +{ #0 'before.all := + #1 'mid.sentence := + #2 'after.sentence := + #3 'after.block := +} +STRINGS { s t} +FUNCTION {output.nonnull} +{ 's := + output.state mid.sentence = + { ", " * write$ } + { output.state after.block = + { add.period$ write$ + newline$ + "\newblock " write$ + } + { output.state before.all = + 'write$ + { add.period$ " " * write$ } + if$ + } + if$ + mid.sentence 'output.state := + } + if$ + s +} +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} +FUNCTION {output.check} +{ 't := + duplicate$ empty$ + { pop$ "empty " t * " in " * cite$ * warning$ } + 'output.nonnull + if$ +} +FUNCTION {fin.entry} +{ add.period$ + write$ + newline$ +} + +FUNCTION {new.block} +{ output.state before.all = + 'skip$ + { after.block 'output.state := } + if$ +} +FUNCTION {new.sentence} +{ output.state after.block = + 'skip$ + { output.state before.all = + 'skip$ + { after.sentence 'output.state := } + if$ + } + if$ +} +FUNCTION {add.blank} +{ " " * before.all 'output.state := +} + +FUNCTION {date.block} +{ + ":" * + add.blank +} + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} +FUNCTION {and} +{ 'skip$ + { pop$ #0 } + if$ +} +FUNCTION {or} +{ { pop$ #1 } + 'skip$ + if$ +} +FUNCTION {new.block.checka} +{ empty$ + 'skip$ + 'new.block + if$ +} +FUNCTION {new.block.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.block + if$ +} +FUNCTION {new.sentence.checka} +{ empty$ + 'skip$ + 'new.sentence + if$ +} +FUNCTION {new.sentence.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.sentence + if$ +} +FUNCTION {field.or.null} +{ duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ +} +FUNCTION {emphasize} +{ duplicate$ empty$ + { pop$ "" } + { "\emph{" swap$ * "}" * } + if$ +} +FUNCTION {slant} +{ duplicate$ empty$ + { pop$ "" } + { "{\sl " swap$ * "}" * } + if$ +} +FUNCTION {tie.or.space.prefix} +{ duplicate$ text.length$ #3 < + { "~" } + { " " } + if$ + swap$ +} + +FUNCTION {capitalize} +{ "u" change.case$ "t" change.case$ } + +FUNCTION {space.word} +{ " " swap$ * " " * } + % Here are the language-specific definitions for explicit words. + % Each function has a name bbl.xxx where xxx is the English word. + % The language selected here is ENGLISH +FUNCTION {bbl.and} +{ "and"} + +FUNCTION {bbl.etal} +{ "et~al." } + +FUNCTION {bbl.editors} +{ "editors" } + +FUNCTION {bbl.editor} +{ "editor" } + +FUNCTION {bbl.edby} +{ "edited by" } + +FUNCTION {bbl.edition} +{ "edition" } + +FUNCTION {bbl.volume} +{ "" } + +FUNCTION {bbl.of} +{ "of" } + +FUNCTION {bbl.nr} +{ "no." } + +FUNCTION {bbl.in} +{ "in" } + +FUNCTION {bbl.pages} +{ "pp." } + +FUNCTION {bbl.page} +{ "p." } + +FUNCTION {bbl.chapter} +{ "chapter" } + +FUNCTION {bbl.techrep} +{ "Technical Report" } + +FUNCTION {bbl.mthesis} +{ "Master's thesis" } + +FUNCTION {bbl.phdthesis} +{ "Ph.D. thesis" } + +MACRO {jan} {"January"} + +MACRO {feb} {"February"} + +MACRO {mar} {"March"} + +MACRO {apr} {"April"} + +MACRO {may} {"May"} + +MACRO {jun} {"June"} + +MACRO {jul} {"July"} + +MACRO {aug} {"August"} + +MACRO {sep} {"September"} + +MACRO {oct} {"October"} + +MACRO {nov} {"November"} + +MACRO {dec} {"December"} + +MACRO {acmcs} {"ACM Computing Surveys"} + +MACRO {acta} {"Acta Informatica"} + +MACRO {cacm} {"Communications of the ACM"} + +MACRO {eptcs} {"Electronic Proceedings in Computer Science"} + +MACRO {ibmjrd} {"IBM Journal of Research and Development"} + +MACRO {ibmsj} {"IBM Systems Journal"} + +MACRO {ieeese} {"IEEE Transactions on Software Engineering"} + +MACRO {ieeetc} {"IEEE Transactions on Computers"} + +MACRO {ieeetcad} + {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"} + +MACRO {ipl} {"Information Processing Letters"} + +MACRO {jacm} {"Journal of the ACM"} + +MACRO {jcss} {"Journal of Computer and System Sciences"} + +MACRO {scp} {"Science of Computer Programming"} + +MACRO {sicomp} {"SIAM Journal on Computing"} + +MACRO {tocs} {"ACM Transactions on Computer Systems"} + +MACRO {tods} {"ACM Transactions on Database Systems"} + +MACRO {tog} {"ACM Transactions on Graphics"} + +MACRO {toms} {"ACM Transactions on Mathematical Software"} + +MACRO {toois} {"ACM Transactions on Office Information Systems"} + +MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"} + +MACRO {tcs} {"Theoretical Computer Science"} +FUNCTION {bibinfo.check} +{ swap$ + duplicate$ missing$ + { + pop$ pop$ + "" + } + { duplicate$ empty$ + { + swap$ pop$ + } + { swap$ + "\bibinfo{" swap$ * "}{" * swap$ * "}" * + } + if$ + } + if$ +} +FUNCTION {bibinfo.warn} +{ swap$ + duplicate$ missing$ + { + swap$ "missing " swap$ * " in " * cite$ * warning$ pop$ + "" + } + { duplicate$ empty$ + { + swap$ "empty " swap$ * " in " * cite$ * warning$ + } + { swap$ + "\bibinfo{" swap$ * "}{" * swap$ * "}" * + } + if$ + } + if$ +} +FUNCTION {either.or.check} +{ empty$ + 'pop$ + { "can't use both " swap$ * " fields in " * cite$ * warning$ } + if$ +} +FUNCTION {format.ee} +{ ee empty$ + { "" } + { "\urlprefix\url{" ee * "}" * } + if$ +} +FUNCTION {format.url} +{ url empty$ + { format.ee } + { "\urlprefix\url{" url * "}" * + "ee and url" ee either.or.check + } + if$ +} + +STRINGS { bibinfo} +INTEGERS { nameptr namesleft numnames } + +FUNCTION {format.names} +{ 'bibinfo := + duplicate$ empty$ 'skip$ { + 's := + "" 't := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{ff~}\surnamestart {vv~}{ll}\surnameend{, jj}" + format.name$ + bibinfo bibinfo.check + 't := + nameptr #1 > + { + namesleft #1 > + { ", " * t * } + { + s nameptr "{ll}" format.name$ duplicate$ "others" = + { 't := } + { pop$ } + if$ + t "others" = + { + " " * bbl.etal * + } + { + "\&" + space.word * t * + } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + } if$ +} +FUNCTION {format.names.ed} +{ + format.names +} +FUNCTION {format.authors} +{ author "author" format.names +} +FUNCTION {get.bbl.editor} +{ editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ } + +FUNCTION {format.editors} +{ editor "editor" format.names duplicate$ empty$ 'skip$ + { + "," * + " " * + get.bbl.editor + * + } + if$ +} +FUNCTION {format.doi} +{ doi + duplicate$ empty$ 'skip$ + { + "\doi{" swap$ * "}" * + } + if$ +} +FUNCTION {format.note} +{ + note empty$ + { "" } + { note #1 #1 substring$ + duplicate$ "{" = + 'skip$ + { output.state mid.sentence = + { "l" } + { "u" } + if$ + change.case$ + } + if$ + note #2 global.max$ substring$ * "note" bibinfo.check + } + if$ +} + +FUNCTION {format.title} +{ title + "title" bibinfo.check + duplicate$ empty$ 'skip$ + { + emphasize + } + if$ +} +FUNCTION {output.bibitem} +{ newline$ + "\bibitemdeclare{" type$ "}{" cite$ "}" * * * * write$ newline$ + "\bibitem{" write$ + cite$ write$ + "}" write$ + newline$ + "" + before.all 'output.state := +} + +FUNCTION {n.dashify} +{ + 't := + "" + { t empty$ not } + { t #1 #1 substring$ "-" = + { t #1 #2 substring$ "--" = not + { "--" * + t #2 global.max$ substring$ 't := + } + { { t #1 #1 substring$ "-" = } + { "-" * + t #2 global.max$ substring$ 't := + } + while$ + } + if$ + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + +FUNCTION {word.in} +{ bbl.in capitalize + " " * } + +FUNCTION {format.date} +{ + "" + duplicate$ empty$ + year "year" bibinfo.check duplicate$ empty$ + { swap$ 'skip$ + { "there's a month but no year in " cite$ * warning$ } + if$ + * + } + { swap$ 'skip$ + { + swap$ + " " * swap$ + } + if$ + * + } + if$ + duplicate$ empty$ + 'skip$ + { + before.all 'output.state := + " (" swap$ * ")" * + } + if$ +} +FUNCTION {format.btitle} +{ title "title" bibinfo.check + duplicate$ empty$ 'skip$ + { + emphasize + } + if$ +} +FUNCTION {volume.or.number} +{ volume missing$ + { number } + { volume } + if$ +} +FUNCTION {format.volume.number.series} +{ volume.or.number missing$ + { series "series" bibinfo.check field.or.null } + { series empty$ + { volume.or.number "volume" bibinfo.check } + { volume.or.number tie.or.space.prefix "volume" bibinfo.check * + series "series" bibinfo.check + duplicate$ empty$ 'pop$ + { slant swap$ * } + if$ + } + if$ + volume missing$ + 'skip$ + { "volume and number" number either.or.check } + if$ + } + if$ +} +FUNCTION {format.edition} +{ edition duplicate$ empty$ 'skip$ + { + output.state mid.sentence = + { "l" } + { "t" } + if$ change.case$ + "edition" bibinfo.check + " " * bbl.edition * + } + if$ +} +INTEGERS { multiresult } +FUNCTION {multi.page.check} +{ 't := + #0 'multiresult := + { multiresult not + t empty$ not + and + } + { t #1 #1 substring$ + duplicate$ "-" = + swap$ duplicate$ "," = + swap$ "+" = + or or + { #1 'multiresult := } + { t #2 global.max$ substring$ 't := } + if$ + } + while$ + multiresult +} +FUNCTION {format.pages} +{ pages duplicate$ empty$ 'skip$ + { duplicate$ multi.page.check + { + bbl.pages swap$ + n.dashify + } + { + bbl.page swap$ + } + if$ + tie.or.space.prefix + "pages" bibinfo.check + * * + } + if$ +} +FUNCTION {format.journal.pages} +{ pages duplicate$ empty$ 'pop$ + { swap$ duplicate$ empty$ + { pop$ pop$ format.pages } + { + ", " * + swap$ + n.dashify + pages multi.page.check + 'bbl.pages + 'bbl.page + if$ + swap$ tie.or.space.prefix + "pages" bibinfo.check + * * + * + } + if$ + } + if$ +} +FUNCTION {format.journal.eid} +{ eid "eid" bibinfo.check + duplicate$ empty$ 'pop$ + { swap$ duplicate$ empty$ 'skip$ + { + ":" * + } + if$ + swap$ * + "eid and pages" pages either.or.check + } + if$ +} +FUNCTION {format.vol.num} +{ volume field.or.null + duplicate$ empty$ 'skip$ + { + "volume" bibinfo.check + } + if$ + number "number" bibinfo.check duplicate$ empty$ 'skip$ + { + swap$ duplicate$ empty$ + { "there's a number but no volume in " cite$ * warning$ } + 'skip$ + if$ + swap$ + "(" swap$ * ")" * + } + if$ * + duplicate$ empty$ 'skip$ + { + swap$ duplicate$ empty$ 'skip$ + { + " " * + } + if$ swap$ + } + if$ * +} + +FUNCTION {format.chapter} +{ chapter empty$ + { "" } + { type empty$ + { bbl.chapter } + { type "l" change.case$ + "type" bibinfo.check + } + if$ + chapter tie.or.space.prefix + "chapter" bibinfo.check + * * + } + if$ +} + +FUNCTION {format.booktitle} +{ + booktitle "booktitle" bibinfo.check + slant +} +FUNCTION {format.in.ed.booktitle} +{ format.booktitle duplicate$ empty$ 'skip$ + { bbl.in capitalize + editor "editor" format.names.ed duplicate$ empty$ 'pop$ + { + " " swap$ * + ", " * + get.bbl.editor * + * } + if$ + ": " * + swap$ * + } + if$ +} +FUNCTION {empty.misc.check} +{ author empty$ title empty$ howpublished empty$ + year empty$ note empty$ + and and and and + key empty$ not and + { "all relevant fields are empty in " cite$ * warning$ } + 'skip$ + if$ +} +FUNCTION {format.thesis.type} +{ type duplicate$ empty$ + 'pop$ + { swap$ pop$ + "t" change.case$ "type" bibinfo.check + } + if$ +} +FUNCTION {format.tr.number} +{ number "number" bibinfo.check + type duplicate$ empty$ + { pop$ bbl.techrep } + 'skip$ + if$ + "type" bibinfo.check + swap$ duplicate$ empty$ + { pop$ "t" change.case$ } + { tie.or.space.prefix * * } + if$ +} +FUNCTION {format.article.crossref} +{ + key duplicate$ empty$ + { pop$ + journal duplicate$ empty$ + { "need key or journal for " cite$ * " to crossref " * crossref * warning$ } + { "journal" bibinfo.check slant word.in swap$ * } + if$ + } + { word.in swap$ * " " *} + if$ + " \cite{" * crossref * "}" * +} +FUNCTION {format.crossref.editor} +{ editor #1 "{vv~}{ll}" format.name$ + "editor" bibinfo.check + editor num.names$ duplicate$ + #2 > + { pop$ + " " * bbl.etal + * + } + { #2 < + 'skip$ + { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = + { + " " * bbl.etal + * + } + { + " \& " + * editor #2 "{vv~}{ll}" format.name$ + "editor" bibinfo.check + * + } + if$ + } + if$ + } + if$ +} +FUNCTION {format.book.crossref} +{ volume duplicate$ empty$ + { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ + pop$ word.in + } + { bbl.volume + capitalize + swap$ tie.or.space.prefix "volume" bibinfo.check * * bbl.of space.word * + } + if$ + editor empty$ + editor field.or.null author field.or.null = + or + { key empty$ + { series empty$ + { "need editor, key, or series for " cite$ * " to crossref " * + crossref * warning$ + "" * + } + { series slant * } + if$ + } + { key * } + if$ + } + { format.crossref.editor * } + if$ + " \cite{" * crossref * "}" * +} +FUNCTION {format.incoll.inproc.crossref} +{ + editor empty$ + editor field.or.null author field.or.null = + or + { key empty$ + { format.booktitle duplicate$ empty$ + { "need editor, key, or booktitle for " cite$ * " to crossref " * + crossref * warning$ + } + { word.in swap$ * } + if$ + } + { word.in key * " " *} + if$ + } + { word.in format.crossref.editor * " " *} + if$ + " \cite{" * crossref * "}" * +} +FUNCTION {format.org.or.pub} +{ 't := + "" + address empty$ t empty$ and + 'skip$ + { + t empty$ + { address "address" bibinfo.check * + } + { t * + address empty$ + 'skip$ + { ", " * address "address" bibinfo.check * } + if$ + } + if$ + } + if$ +} +FUNCTION {format.publisher.address} +{ publisher "publisher" bibinfo.warn format.org.or.pub +} + +FUNCTION {format.organization.address} +{ organization "organization" bibinfo.check format.org.or.pub +} + +FUNCTION {article} +{ output.bibitem + format.authors "author" output.check + format.date "year" output.check + date.block + format.title "title" output.check + new.block + crossref missing$ + { + journal + "journal" bibinfo.check + slant + "journal" output.check + format.vol.num + } + { format.article.crossref output.nonnull + } + if$ + eid empty$ + { format.journal.pages } + { format.journal.eid } + if$ + format.doi output + new.block + format.url output + new.block + format.note output + fin.entry +} +FUNCTION {book} +{ output.bibitem + author empty$ + { format.editors "author and editor" output.check + } + { format.authors output.nonnull + crossref missing$ + { "author and editor" editor either.or.check } + 'skip$ + if$ + } + if$ + format.date "year" output.check + date.block + format.btitle "title" output.check + crossref missing$ + { format.edition output + new.block + format.volume.number.series output + format.publisher.address output + } + { + new.block + format.book.crossref output.nonnull + } + if$ + format.doi output + new.block + format.url output + new.block + format.note output + fin.entry +} +FUNCTION {booklet} +{ output.bibitem + format.authors output + format.date output + date.block + format.title "title" output.check + new.block + howpublished "howpublished" bibinfo.check output + address "address" bibinfo.check output + format.doi output + new.block + format.url output + new.block + format.note output + fin.entry +} + +FUNCTION {inbook} +{ output.bibitem + author empty$ + { format.editors "author and editor" output.check + } + { format.authors output.nonnull + crossref missing$ + { "author and editor" editor either.or.check } + 'skip$ + if$ + } + if$ + format.date "year" output.check + date.block + format.btitle "title" output.check + crossref missing$ + { + format.edition output + format.chapter output + format.pages output + new.block + format.volume.number.series output + format.publisher.address output + } + { + format.chapter output + format.pages output + new.block + format.book.crossref output.nonnull + } + if$ + format.doi output + new.block + format.url output + new.block + format.note output + fin.entry +} + +FUNCTION {incollection} +{ output.bibitem + format.authors "author" output.check + format.date "year" output.check + date.block + format.title "title" output.check + new.block + crossref missing$ + { format.in.ed.booktitle "booktitle" output.check + format.edition output + format.chapter output + format.volume.number.series output + format.publisher.address output + } + { format.incoll.inproc.crossref output.nonnull + format.chapter output + } + if$ + format.pages "pages" output.check + format.doi output + new.block + format.url output + new.block + format.note output + fin.entry +} +FUNCTION {inproceedings} +{ output.bibitem + format.authors "author" output.check + format.date "year" output.check + date.block + format.title "title" output.check + new.block + crossref missing$ + { format.in.ed.booktitle "booktitle" output.check + format.volume.number.series output + publisher empty$ + { format.organization.address output } + { organization "organization" bibinfo.check output + format.publisher.address output + } + if$ + } + { format.incoll.inproc.crossref output.nonnull + } + if$ + format.pages "pages" output.check + format.doi output + new.block + format.url output + new.block + format.note output + fin.entry +} +FUNCTION {conference} { inproceedings } +FUNCTION {manual} +{ output.bibitem + author empty$ + { organization "organization" bibinfo.check + duplicate$ empty$ 'pop$ + { output + address "address" bibinfo.check output + } + if$ + } + { format.authors output.nonnull } + if$ + format.date output + date.block + format.btitle "title" output.check + format.edition output + author empty$ + { organization empty$ + { + address new.block.checka + address "address" bibinfo.check output + } + 'skip$ + if$ + } + { + organization address new.block.checkb + organization "organization" bibinfo.check output + address "address" bibinfo.check output + } + if$ + format.doi output + new.block + format.url output + new.block + format.note output + fin.entry +} + +FUNCTION {mastersthesis} +{ output.bibitem + format.authors "author" output.check + format.date "year" output.check + date.block + format.btitle + "title" output.check + new.block + bbl.mthesis format.thesis.type output.nonnull + school "school" bibinfo.warn output + address "address" bibinfo.check output + format.doi output + new.block + format.url output + new.block + format.note output + fin.entry +} + +FUNCTION {misc} +{ output.bibitem + format.authors output + format.date output + output.state before.all = + 'skip$ + {date.block} + if$ + title howpublished new.block.checkb + format.title output + howpublished new.block.checka + howpublished "howpublished" bibinfo.check output + format.doi output + new.block + format.url output + new.block + format.note output + fin.entry + empty.misc.check +} +FUNCTION {phdthesis} +{ output.bibitem + format.authors "author" output.check + format.date "year" output.check + date.block + format.btitle + "title" output.check + new.block + bbl.phdthesis format.thesis.type output.nonnull + school "school" bibinfo.warn output + address "address" bibinfo.check output + format.doi output + new.block + format.url output + new.block + format.note output + fin.entry +} + +FUNCTION {proceedings} +{ output.bibitem + editor empty$ + { organization "organization" bibinfo.check output + } + { format.editors output.nonnull } + if$ + format.date "year" output.check + date.block + format.btitle "title" output.check + editor empty$ + { publisher empty$ + { new.sentence format.volume.number.series output } + { + new.sentence + format.volume.number.series output + format.publisher.address output + } + if$ + } + { publisher empty$ + { + new.sentence + format.volume.number.series output + format.organization.address output } + { + new.sentence + format.volume.number.series output + organization "organization" bibinfo.check output + format.publisher.address output + } + if$ + } + if$ + format.doi output + new.block + format.url output + new.block + format.note output + fin.entry +} + +FUNCTION {techreport} +{ output.bibitem + format.authors "author" output.check + format.date "year" output.check + date.block + format.title + "title" output.check + new.block + format.tr.number output.nonnull + institution "institution" bibinfo.warn output + address "address" bibinfo.check output + format.doi output + new.block + format.url output + new.block + format.note output + fin.entry +} + +FUNCTION {unpublished} +{ output.bibitem + format.authors "author" output.check + format.date output + date.block + format.title "title" output.check + format.doi output + new.block + format.url output + new.block + format.note "note" output.check + fin.entry +} + +FUNCTION {default.type} { misc } +READ +FUNCTION {sortify} +{ purify$ + "l" change.case$ +} +INTEGERS { len } +FUNCTION {chop.word} +{ 's := + 'len := + s #1 len substring$ = + { s len #1 + global.max$ substring$ } + 's + if$ +} +FUNCTION {sort.format.names} +{ 's := + #1 'nameptr := + "" + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{ll{ }}{ ff{ }}{ jj{ }}" + format.name$ 't := + nameptr #1 > + { + " " * + namesleft #1 = t "others" = and + { "zzzzz" * } + { t sortify * } + if$ + } + { t sortify * } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {sort.format.title} +{ 't := + "A " #2 + "An " #3 + "The " #4 t chop.word + chop.word + chop.word + sortify + #1 global.max$ substring$ +} +FUNCTION {author.sort} +{ author empty$ + { key empty$ + { "to sort, need author or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { author sort.format.names } + if$ +} +FUNCTION {author.editor.sort} +{ author empty$ + { editor empty$ + { key empty$ + { "to sort, need author, editor, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { editor sort.format.names } + if$ + } + { author sort.format.names } + if$ +} +FUNCTION {author.organization.sort} +{ author empty$ + { organization empty$ + { key empty$ + { "to sort, need author, organization, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { "The " #4 organization chop.word sortify } + if$ + } + { author sort.format.names } + if$ +} +FUNCTION {editor.organization.sort} +{ editor empty$ + { organization empty$ + { key empty$ + { "to sort, need editor, organization, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { "The " #4 organization chop.word sortify } + if$ + } + { editor sort.format.names } + if$ +} +FUNCTION {presort} +{ type$ "book" = + type$ "inbook" = + or + 'author.editor.sort + { type$ "proceedings" = + 'editor.organization.sort + { type$ "manual" = + 'author.organization.sort + 'author.sort + if$ + } + if$ + } + if$ + " " + * + year field.or.null sortify + * + " " + * + title field.or.null + sort.format.title + * + #1 entry.max$ substring$ + 'sort.key$ := +} +ITERATE {presort} +SORT +STRINGS { longest.label } +INTEGERS { number.label longest.label.width } +FUNCTION {initialize.longest.label} +{ "" 'longest.label := + #1 'number.label := + #0 'longest.label.width := +} +FUNCTION {longest.label.pass} +{ number.label int.to.str$ 'label := + number.label #1 + 'number.label := + label width$ longest.label.width > + { label 'longest.label := + label width$ 'longest.label.width := + } + 'skip$ + if$ +} +EXECUTE {initialize.longest.label} +ITERATE {longest.label.pass} +FUNCTION {begin.bib} +{ preamble$ empty$ + 'skip$ + { preamble$ write$ newline$ } + if$ + "\begin{thebibliography}{" longest.label * "}" * + write$ newline$ + "\providecommand{\bibitemdeclare}[2]{}" + write$ newline$ + "\providecommand{\surnamestart}{}" + write$ newline$ + "\providecommand{\surnameend}{}" + write$ newline$ + "\providecommand{\urlprefix}{Available at }" + write$ newline$ + "\providecommand{\url}[1]{\texttt{#1}}" + write$ newline$ + "\providecommand{\href}[2]{\texttt{#2}}" + write$ newline$ + "\providecommand{\urlalt}[2]{\href{#1}{#2}}" + write$ newline$ + "\providecommand{\doi}[1]{doi:\urlalt{http://dx.doi.org/#1}{#1}}" + write$ newline$ + "\providecommand{\bibinfo}[2]{#2}" + write$ newline$ +} +EXECUTE {begin.bib} +EXECUTE {init.state.consts} +ITERATE {call.type$} +FUNCTION {end.bib} +{ newline$ + "\end{thebibliography}" write$ newline$ +} +EXECUTE {end.bib} +%% End of customized bst file +%% +%% End of file `eptcs.bst'. diff --git a/publications/pxtp21/eptcs.cls b/publications/pxtp21/eptcs.cls new file mode 100644 index 0000000000000000000000000000000000000000..3a5f6b1652136afdbd6941b44295d01cbc5df38e --- /dev/null +++ b/publications/pxtp21/eptcs.cls @@ -0,0 +1,263 @@ +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesClass{eptcs}[2020/12/20 v1.6] + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%% options %%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\newif\ifadraft +\newif\ifsubmission +\newif\ifpreliminary +\newif\ifcopyright +\newif\ifpublicdomain +\newif\ifcreativecommons +\newif\ifnoderivs +\newif\ifsharealike +\newif\ifnoncommercial +\adraftfalse +\submissionfalse +\preliminaryfalse +\copyrightfalse +\publicdomainfalse +\creativecommonsfalse +\noderivsfalse +\sharealikefalse +\noncommercialfalse +\DeclareOption{adraft}{\adrafttrue} +\DeclareOption{submission}{\submissiontrue} +\DeclareOption{preliminary}{\preliminarytrue} +\DeclareOption{copyright}{\copyrighttrue} +\DeclareOption{publicdomain}{\publicdomaintrue} +\DeclareOption{creativecommons}{\creativecommonstrue} +\DeclareOption{noderivs}{\noderivstrue} +\DeclareOption{noncommercial}{\noncommercialtrue} +\DeclareOption{sharealike}{\sharealiketrue} +\ProcessOptions\relax + +\LoadClass[letterpaper,11pt,twoside]{article} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% On US letter paper the margins (left-top-right-bottom) are %% +%% 2.795cm - 1.23cm - 2.795cm - 3.46cm %% +%% Note: When \topmargin would be 0, the real top margin would be %% +%% (72-25-12=35pt) + 1pt (unused portion of head) = .5in = 1.27cm. %% +%% The bottom margin is 11in - 1in + 0.04cm - 623/72in = 3.46cm. %% +%% On the first page the bottom margin contains various footers. %% +%% When translating from US letter to A4 paper, without scaling, by %% +%% leaving the centre of the paper invariant (as is possible when %% +%% printing the paper with acroread), the resulting A4 margins are %% +%% 2.5cm - 2.11cm - 2.5cm - 4.34cm %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\textwidth 16cm % A4 width is 21cm % +\textheight 623.01pt % 46 lines exactly = 21.98cm % +\oddsidemargin -0.04cm % +1 inch = 2.5cm % +\evensidemargin -0.04cm % +1 inch = 2.5cm % +\topmargin -0.04cm % +1 inch = 2.5cm % +\advance\topmargin-\headheight % 12pt % +\advance\topmargin-\headsep % 25pt % +\marginparwidth 45pt % leaves 15pt from A4 edge % +\advance\evensidemargin .295cm % centre w.r.t. letter paper % +\advance\oddsidemargin .295cm % centre w.r.t. letter paper % + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%% load eptcsdata when available %%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\IfFileExists{eptcsdata.tex}{\input{eptcsdata}}{} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%% Pagestyle and titlepage %%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\pagestyle{myheadings} +\renewcommand\pagestyle[1]{} % ignore further \pagestyles + +\renewcommand\maketitle{\par + \begingroup + \providecommand{\event}{} + \ifadraft + \providecommand{\publicationstatus}{\Large DRAFT\quad\today} + \else\ifsubmission + \providecommand{\publicationstatus}{Submitted to:\\ + \event} + \else\ifpreliminary + \providecommand{\publicationstatus}{Preliminary Report. Final version to appear in:\\ + \event} + \else + \providecommand{\publicationstatus}{To appear in EPTCS.} + \fi\fi\fi + \providecommand{\titlerunning}{Please define {\tt $\backslash$titlerunning}} + \providecommand{\authorrunning}{Please define {\tt $\backslash$authorrunning}} + \providecommand{\copyrightholders}{\authorrunning} + \renewcommand\thefootnote{\@fnsymbol\c@footnote}% + \def\@makefnmark{\rlap{\@textsuperscript{\normalfont\@thefnmark}}}% + \long\def\@makefntext##1{\parindent 1em\noindent + \hb@xt@1.8em{% + \hss\@textsuperscript{\normalfont\@thefnmark}}##1}% + \newpage + \global\@topnum\z@ % Prevents figures from going at top of page. + \@maketitle + \thispagestyle{empty}\@thanks + \endgroup + \setcounter{footnote}{0}% + \label{FirstPage} + \global\let\thanks\relax + \global\let\maketitle\relax + \global\let\@maketitle\relax + \global\let\@thanks\@empty + \global\let\@author\@empty + \global\let\@date\@empty + \global\let\@title\@empty + \global\let\title\relax + \global\let\author\relax + \global\let\date\relax + \global\let\and\relax +} +\def\@maketitle{% adapted from article.cls + \newpage +\noindent +\raisebox{-22.8cm}[0pt][0pt]{\footnotesize +\begin{tabular}{@{}l} +\publicationstatus +\end{tabular}} +\hfill\vspace{-1em} +\raisebox{-22.8cm}[0pt][0pt]{\footnotesize +\makebox[0pt][r]{ +\begin{tabular}{l@{}} +\ifpublicdomain + This work is \href{https://creativecommons.org/publicdomain/zero/1.0/} + {dedicated to the public domain}. +\else + \ifcopyright + \copyright~\copyrightholders\\ + \fi + \ifcreativecommons + This work is licensed under the + \ifnoncommercial + \href{https://creativecommons.org}{Creative Commons}\\ + \ifnoderivs + \href{https://creativecommons.org/licenses/by-nc-nd/4.0/} + {Attribution-Noncommercial-No Derivative Works} License. + \else\ifsharealike + \href{https://creativecommons.org/licenses/by-nc-sa/4.0/} + {Attribution-Noncommercial-Share Alike} License. + \else + \href{https://creativecommons.org/licenses/by-nc/4.0/} + {Attribution-Noncommercial} License. + \fi\fi + \else + \ifnoderivs + \href{https://creativecommons.org}{Creative Commons}\\ + \href{https://creativecommons.org/licenses/by-nd/4.0/} + {Attribution-No Derivative Works} License. + \else\ifsharealike + \href{https://creativecommons.org}{Creative Commons}\\ + \href{https://creativecommons.org/licenses/by-sa/4.0/} + {Attribution-Share Alike} License. + \else + \\\href{https://creativecommons.org}{Creative Commons} + \href{https://creativecommons.org/licenses/by/4.0/} + {Attribution} License. + \fi\fi + \fi + \fi +\fi +\end{tabular}}} + \null + %\vskip 2em% a bit of space removed (< 2em) + \begin{center}% + \let \footnote \thanks + {\LARGE\bf \@title \par}% \bf added + \vskip 2em% was: 1.5em + {\large + \lineskip .5em% + \begin{tabular}[t]{c}% + \@author + \end{tabular}\par}% + \vskip 1em% \date and extra space removed + \end{center}% + \par + \markboth{\hfill\titlerunning}{\authorrunning\hfill} + \vskip .5em} + +\AtBeginDocument{ + \providecommand{\firstpage}{1} + \setcounter{firstpage}{\firstpage} + \setcounter{page}{\firstpage} + \@ifpackageloaded{array}% Contributed by Wolfgang Jeltsch + {\newcommand{\IfArrayPackageLoaded}[2]{#1}} + {\newcommand{\IfArrayPackageLoaded}[2]{#2}}} +\newcommand{\institute}[1]{\IfArrayPackageLoaded + {\\{\scriptsize\begin{tabular}[t]{@{}>{\footnotesize}c@{}}#1\end{tabular}}} + {\\{\scriptsize\begin{tabular}[t]{@{\footnotesize}c@{}}#1\end{tabular}}}} +\newcommand{\email}[1]{\\{\footnotesize\tt #1}} + +\renewenvironment{abstract}{\begin{list}{}% header removed and noindent + {\rightmargin\leftmargin + \listparindent 1.5em + \parsep 0pt plus 1pt} + \small\item}{\end{list} +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\RequirePackage{hyperref} % add hyperlinks +\RequirePackage{mathptmx} % Pick Times Roman as a base font + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%% Remember page numbers %%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\newcounter{firstpage} +\setcounter{firstpage}{1} +\AtEndDocument{\clearpage + \addtocounter{page}{-1} + \immediate\write\@auxout{\string + \newlabel{LastPage}{{}{\thepage}{}{page.\thepage}{}}}% + \newwrite\pages + \immediate\openout\pages=\jobname.pag + \immediate\write\pages{\arabic{firstpage}-\arabic{page}} + \addtocounter{page}{1}} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%% Less space in lists %%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\def\@listi{\leftmargin\leftmargini + \parsep 2.5\p@ \@plus1.5\p@ \@minus\p@ + \topsep 5\p@ \@plus2\p@ \@minus5\p@ + \itemsep2.5\p@ \@plus1.5\p@ \@minus\p@} +\let\@listI\@listi +\@listi +\def\@listii {\leftmargin\leftmarginii + \labelwidth\leftmarginii + \advance\labelwidth-\labelsep + \topsep 1\p@ \@plus\p@ \@minus\p@ + \parsep 1\p@ \@plus\p@ \@minus\p@ + \itemsep \parsep} +\def\@listiii{\leftmargin\leftmarginiii + \labelwidth\leftmarginiii + \advance\labelwidth-\labelsep + \topsep \z@ + \parsep \z@ + \itemsep \topsep} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%% References small and with less space between items %%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\renewenvironment{thebibliography}[1] + {\section*{\refname}\small% small added + \list{\@biblabel{\@arabic\c@enumiv}}% + {\settowidth\labelwidth{\@biblabel{#1}}% + \leftmargin\labelwidth + \advance\leftmargin\labelsep + \@openbib@code + \usecounter{enumiv}% + \let\p@enumiv\@empty + \renewcommand\theenumiv{\@arabic\c@enumiv}}% + \sloppy + \clubpenalty4000 + \@clubpenalty \clubpenalty + \widowpenalty4000% + \sfcode`\.\@m + \setlength{\parskip}{0pt}% + \setlength{\itemsep}{3pt plus 2pt}% less space between items + } + {\def\@noitemerr + {\@latex@warning{Empty `thebibliography' environment}}% + \endlist} diff --git a/publications/pxtp21/extended_abstract.tex b/publications/pxtp21/extended_abstract.tex new file mode 100644 index 0000000000000000000000000000000000000000..a2afec2a7e6f6ff101386b031e7ee787498ce1a3 --- /dev/null +++ b/publications/pxtp21/extended_abstract.tex @@ -0,0 +1,426 @@ +\documentclass[submission,copyright,creativecommons]{eptcs} + +\providecommand{\event}{PxTP 2021} % Name of the event you are submitting to +\usepackage{breakurl} % Not needed if you use pdflatex only. +\usepackage{underscore} % Only needed if you use pdflatex. +\usepackage{todonotes} + +\usepackage[frozencache=true]{minted} +\usemintedstyle{trac} + +\usepackage{microtype} +\microtypesetup{final,tracking=true,kerning=true,spacing=true,stretch=10,shrink=10,letterspace=25} +\microtypecontext{spacing=nonfrench} + +\def\orcid#1{\smash{\href{http://orcid.org/#1}{\protect\raisebox{-1.25pt}{\protect\includegraphics{orcid.pdf}}}}} + +\title{Alethe: Towards a Generic SMT Proof Format\\ (extended abstract)} +\author{% +Hans-Jörg Schurr +\orcid{0000-0002-0829-5056} +\institute{University of Lorraine, CNRS, Inria, and LORIA, Nancy, France} +\email{hans-jorg.schurr@inria.fr} +\and +Mathias Fleury +\orcid{0000-0002-1705-3083} +\institute{Johannes Kepler University Linz, Austria} +\email{mathias.fleury@jku.at} +\and +Haniel Barbosa +\orcid{0000-0003-0188-2300} +\institute{Universidade Federal de Minas Gerais, Belo Horizonte, Brazil} +\email{hbarbosa@dcc.ufmg.br} +\and +Pascal Fontaine +\orcid{0000-0003-4700-6031} +\institute{University of Liège, Belgium} +\email{pascal.fontaine@uliege.be} +} + +\def\titlerunning{Towards a Generic SMT Proof Format} +\def\authorrunning{Schurr, Fleury, Barbosa, and Fontaine} + +\begin{document} +\maketitle + +\begin{abstract} + The first iteration of the proof format used by the SMT solver veriT was + presented ten years ago at the first PxTP workshop. + % + Since then the format has matured. veriT proofs are used + within multiple applications, and other solvers generate proofs in the + same format. + % + We would now like to gather feedback from the community to guide future + developments. + % + Towards this, we review the history of the format, present + our pragmatic approach to develop the format, and + also discuss problems that might arise when other solvers use the format. +\end{abstract} + +\noindent +Over the years the production of machine-consumable formal proofs of +unsatisfiability from SMT solvers~\cite{Barrett2018} has attracted significant +attention~\cite{barrett-2015}. +% +Such proofs enable users to certify unsatisfiability results similarly to how +satisfiable results may be certified via models. +% +However, a major difficulty that SMT proof formats +must address is the complex and +heterogeneous nature of SMT solvers: a SAT solver drives +multiple, often very +% +different, theory solvers; instantiation procedures +generate ground instances; and heavily theory-dependent simplification techniques +ensure that the solvers are fast in practice. +% +Moreover, how each of these components works internally can also differ from +solver to solver. +% +As a testament to these challenges proof formats for SMT solvers have been +mostly restricted to individual solvers and no standard has emerged. +% +To be adopted by several solvers, an SMT proof format must be carefully designed +to accommodate needs of specific +solvers. This will require repeated refinement and generalization. + +The basis for our efforts in this field is the proof format implemented by the +SMT solver veriT~\cite{verit} that is now mature and used by multiple systems. +To further improve the format, as well as to accommodate not only the reasoning +of the SMT solver veriT but also of other solvers, we are currently extending +the format and developing better tooling, such as an independent proof checker. +To facilitate this effort and overall usage, we are also writing a full +specification. +To emphasize the independence of the format we are baptizing it +\emph{Alethe}.\footnote{Alethe is a genus of small birds and the name resembles \emph{aletheia}, +the Greek word for truth.} +% +We do not presume to propose a standard format a priori. Instead we believe that +Alethe, together with its tooling, can provide a basis for further discussions +on how to achieve a format to be used by multiple solvers. + +\section{The State of Alethe} + +Alethe combines two major ideas +whose roots reach back ten years to the first PxTP workshop in +2011~\cite{besson-2011,deharbe-2011}. +It was proposed as +an easy-to-produce format with a term language very close to +SMT-LIB~\cite{SMTLIB}, the standard input language of SMT solvers, and rules +with a varying level of granularity, allowing implicit proof steps in the proof +and thus relying on powerful proof checkers capable of filling the gaps. +% +Since then the format has been refined and extended~\cite{barbosa-2019}. It is now +mature, supports coarse- and fine-grained proof steps capturing +SMT solving for the SMT-LIB logic UFLIRA\footnote{That is the logic for + problems containing a mix of any of quantifiers, + uninterpreted + functions, and linear arithmetic.} and can be reconstructed by the proof +assistants Coq~\cite{Armand2011,SMTCoq} and +Isabelle~\cite{fleury-2019,schurr-2021}. +% +In particular, the integration with Coq was also used as a bridge for the +reconstruction of proofs from the SMT solver CVC4~\cite{Barrett2011} in +Coq, where its proofs in the LFSC format~\cite{Stump2013} were +first translated into the veriT format before reconstruction. +% +Finally, the format will also be natively supported in the upcoming cvc5. +solver\footnote{\url{https://cvc4.github.io/2021/04/02/cvc5-announcement.html}} + +On the one hand, Alethe uses a +natural-deduction style calculus driven mostly by resolution~\cite{besson-2011}. +To handle +first-order reasoning, dedicated quantifier instantiation rules are used~\cite{deharbe-2011}. +On the other hand, it +implements novel ideas to express reasoning typically used for processing, +such as Skolemization, renaming of variables, and other manipulations +of bound variables~\cite{barbosa-2019}. +While the format was always inspired by the SMT-LIB language, +we recently~\cite{fleury-2019} changed +the syntax of Alethe to closely resemble the command structure +used within SMT-LIB. When possible Alethe uses existing SMT-LIB features, +such as the \texttt{define-fun} command to define constants and the \texttt{:named} +annotation to implement term sharing. + +The following proof fragment gives a taste of the format. The +fragment first renames the bound variable in the term $\exists x.\,f(x)$ from +$x$ to $\mathit{vr}$ and then skolemizes the quantifier. A proof is a +list of commands. The \emph{assume} command introduces an assumption, \emph{anchor} +starts a subproof, and \emph{step} denotes an ordinary proof step. Steps are +annotated with an identifier, a rule, and premises. The SMT-LIB command \emph{define-fun} +defines a function. +The rule \emph{bind} used by step \texttt{t1} performs the renaming +of the bound variable. It uses a subproof (Steps \texttt{t1.t1} and +\texttt{t1.t2}). The subproof uses a context to denote that \texttt{x} +is equal to \texttt{vr} within the subproof. The \texttt{anchor} command +starts the subproof and introduces the context. +The \texttt{bind} rule does not only make it possible to +rename bound variables, but within the subproof it is possible +to simplify the formula as done during preprocessing. +The steps \texttt{t2} and \texttt{t3} use resolution to finish the +renaming. +In step +\texttt{t4} the bound variable is skolemized. Skolemization uses +the choice binder $\epsilon$ and derives $f(\epsilon\mathit{vr}.\, f(\mathit{vr}))$ +from $\exists \mathit{vr}.\, f(\mathit{vr})$. To simplify the reconstruction +the choice term is introduced as a defined constant (by \texttt{define-fun}). Finally, resolution +is used again to finish the proof. +\begin{minted}{smtlib2.py -x} + (assume a0 (exists ((x A)) (f x))) + (anchor :step t1 :args (:= x vr)) + (step t1.t1 (cl (= x vr)) :rule cong) + (step t1.t2 (cl (= (f x) (f vr))) :rule cong) + (step t1 (cl (= (exists ((x A)) (f x)) + (exists ((vr A)) (f vr)))) :rule bind) + (step t2 (cl (not (= (exists ((vr A)) (f x)) + (exists ((vr A)) (f vr)))) + (not (exists ((vr A)) (f x))) + (exists ((vr A)) (f vr))) :rule equiv_pos1) + (step t3 (cl (exists ((vr A)) (f vr))) :premises (a0 t1 t2) :rule resolution) + (define-fun X () A (choice ((vr A)) (f vr))) + (step t4 (cl (= (exists ((vr A)) (f vr)) (f X))) :rule sko_ex) + (step t5 (cl (not (= (exists ((vr A)) (f vr)) (f X))) + (not (exists ((vr A)) (f vr))) + (f X)) :rule equiv_pos1) + (step t6 (cl (f X)) :premises (t3 t4 t5) :rule resolution) +\end{minted} + +The output of Alethe proofs from veriT has now reached a certain level of maturity. +The 2021 version of the Isabelle theorem prover was released earlier this year +and supports the reconstruction of +Alethe proofs generated by veriT. Users of Isabelle/HOL can invoke the \texttt{smt} +tactic. This tactic encodes the current proof goal as an SMT-LIB problem and +calls an SMT solver. Previously only the SMT solver Z3 was supported. Now +veriT is supported too. If the solver produces a proof, the proof is +reconstructed within the Isabelle kernel. In practice, users will seldom +choose the \texttt{smt} tactic themselves. Instead, they call the +Sledgehammer tool that calls external tools to find relevant facts. Sometimes, +the external tool finds a proof, but the proof cannot be imported into Isabelle, +requiring the user to write a proof manually. +The addition of the veriT-powered \texttt{smt} tactic halves~\cite{schurr-2021} the rate +of this kind of failures. The improvement is especially pronounced for proofs found by CVC4. +A key reason for this improvement is the support for the +conflicting-instance instantiation technique within veriT. Z3, the +singular SMT solver supported previously, does not implement this +technique. Nevertheless, it is Alethe that allowed us to connect veriT +to Isabelle, and we hope that the support for Alethe in other solvers +will ease this connection between powerful SMT solvers and other tools in the future. + +The process of implementing proof reconstruction in Isabelle also +helped us to improve the proof format. We found both, +possible improvements in the format (like providing the Farkas' coefficient for +lemmas of linear arithmetic) and in the implementation (by identifying +concrete errors). +One major shortcoming of the proofs were rules that combined several simplification +steps into one. +We replaced these steps by +multiple simple and well-defined rules. In particular every simplification rule +addresses a specific theory instead of combining them. +An interesting +observation of the reconstruction in Isabelle is that some steps can be skipped +to improve performance. For example, the proofs for the renaming of variables +are irrelevant for Isabelle since this uses De~Bruijn indices. +% +This shows that reconstruction specific +optimizations can counterbalance the proof length which is increased by fine-grained +rules. +% +We will take this prospect into account as we further refine the format. + +\section{A Glance Into the Future} +The development of the Alethe proof format so far was not a monolithic +process. Both practical considerations and research progress --- such as +supporting fine-grained preprocessing rules --- influenced the development process. +Due to this, the format is not fully homogeneous, but this approach allowed +us to quickly adapt the format when necessary. We will continue this +pragmatic approach. + +\paragraph{Speculative Specification.} + +We are writing a speculative specification.\footnote{The current +version is available at +\url{http://www.verit-solver.org/documentation/alethe-spec.pdf}.} +During the development of the Isabelle reconstruction it became necessary +to document the proof rules in a coherent and complete manner. When we +started to develop the reconstruction there was only an automatically +generated list of rules with a short comment for each rule. While +this is enough for simple tautological rules, it does not provide a clear +definition of the more complex rules such as the linear arithmetic rules. +% +To rectify this, we studied veriT's source code and wrote an independent +document with a list of all rules and a clear mathematical definition +of each rule. +% +We chose a +level of precision for these descriptions that serves the implementer: +precise enough to clarify the edge case, but without the details that would make it a fully formal specification. +We are now extending this document to a full specification of the format. +This specification is speculative in the sense that it will not be cast +in stone. It will describe the format as it is in use +at any point in time and will develop in parallel with practical support for the +format within SMT solvers, proof checkers, and other tools. + +\paragraph{Flexible Rules.} + +The next solver that will gain support for the Alethe format is the upcoming +cvc5 solver. Implementing a proof format into another solver reveals where the +proof format is too tied to the current implementation of veriT. On the one +hand, new proof rules must be added to the format --- e.g., veriT does not +support the theory of bitvectors, while cvc5 does. +% +When CVC4 was integrated into Coq via a translation of its LFSC proofs into +Alethe proofs~\cite{SMTCoq}, an ad-hoc extension with bitvector rules was +made. A revised version of this extension will now be incorporated into the +upcoming specification of the format so that cvc5 bitvector proofs can be +represented in Alethe. +% +Further extensions to other theories supported by cvc5, like the theory of +strings, will eventually be made as well. + +Besides new theories, cvc5 can also be stricter than veriT in the usage +of some rules. +% +This strictness can simplify the reconstruction, since less search is +required. +% +A good example of this is the \texttt{trans} rule that expresses +transitivity. +% +This rule has a list of equalities as premises and the conclusion is +an equality derived by transitivity. +% +In principle, this rule can have three levels of ``strictness'': +\begin{enumerate} +\item The premises are ordered and the equalities are correctly oriented (like in cvc5), e.g., + \(a=b\), \(b=c\), and \(c=d\) implies \(a=d\). +\item The premises are ordered but the equalities might not be correctly oriented (like in veriT), e.g., + \(b=a\), \(c=b\), and \(d=c\) implies \(d=a\). +\item Neither are the assumptions ordered, nor are the equalities oriented, e.g., \(c=b\), + \(b=a\), and \(d=c\) implies \(d=a\). +\end{enumerate} + +\noindent +The most strict variant is the easiest to reconstruct: a straightforward linear +traversal of the premises suffices for checking. +% +From the point of view of producing it from the solver, however, this version is +the hardest to implement. This is due to implementations of the +congruence closure decision procedure~\cite{Nelson1980,Downey1980} in SMT +solvers being generally agnostic to the order of equalities, which can lead to +implicit reorientations that can be difficult to track. +% +Anecdotally, for cvc5 to achieve this level of detail several months of work +were necessary, within the overall effort of redesigning from scratch CVC4's +proof infrastructure. +% +Since we cannot assume every solver developer will, or even should, undertake +such an effort, all the different levels of granularity must be allowed by the +format, each requiring different complexity levels of checking. + +To keep the proof format flexible and proofs easy to produce, we will +provide different versions of proof rules, with varying levels of granularity as +in the transitivity example case above, by \emph{annotating} them. +% +This leverages the rule \emph{arguments}, +% +which are already used by some +rules. +% +For example, the Farkas' coefficient of the linear arithmetic rule are provided +as arguments. +% +This puts pressure on proof checkers and reconstruction in proof assistants to +support all the variants or at least the most general one (at the cost of +efficiency). Hence, our design principle here is that the annotation is +optional: the absence of an annotation denotes the least strict version of the +rule. + +\paragraph{Powerful Tooling.} + +We believe that powerful software tools may greatly increase the utility of a +proof format. +% +Towards this end we have started implementing an independent proof checker for +Alethe. +% +In contrast to a proof-assistant-based reconstruction, this checker will not be +structured around a small, trusted kernel, and correct-by-construction +extensions. Instead, the user would need to trust the implementation does not +lead to wrong checking results. +% +Instead, its focus is on performance, support for multiple features and greater +flexibility for integrating extensions and refinements to the format. +% +The Isabelle checker is currently not suited +to this task --- one major issue is that it does not support SMT-LIB input +files.\footnote{A version capable of doing so was developed for Z3 but it was unfortunately lost.} + +This independent checker will also serve as a proof ``elaborator''. +% +Rather than checking, it will also allow converting a coarse-grained proof, +containing implicit steps, to a fine-grained one, with more detailed steps. The +resulting proof can then be more efficiently checked by the tool itself or +via proof-assistant reconstructions. +% +An example of such elaboration is the transitivity rule. +% +If the rule is not in its most detailed version, with premises in the correct +order and none implicitly reordered, it can be elaborated by greedily reordering +the premises and adding proof steps using the symmetry of equality. +% +Note however that in the limit detailing coarse-grained steps can be as hard as +solving an SMT problem. Should such cases arise, the checker will rely on internal +proof-producing procedures capable of producing a detailed proof for the given +step. At first the veriT and cvc5 solvers, which can produce fine-grained proofs +for several aspects of SMT solving, could be used in such cases. + +A nice side effect of the use of an external checker is that it could prune useless +steps. Currently SMT solvers keep a full proof trace in memory and print a pruned +proof after solving finishes. This is in contrast to SAT solvers that dump proofs +on-the-fly. For SAT proofs, the pruned proof can be obtained from a full trace by using a tool like +\textsc{Drat-Trim}. There is some ongoing work by Nikolaj Bjørner on Z3 to also generate proofs +on-the-fly, but it is not clear how to support preprocessing and quantifiers.\footnote{\url{https://github.com/Z3Prover/z3/discussions/4881}} + +\section{Conclusion} +\label{sec:concl} + +We have presented on overview of the current state of the Alethe proof format +and some ideas on how we intend to improve and extend the format, as well as +supporting tools. +% +In designing a new proof format supported across two solvers we hope to provide +a first step towards a format adopted by more solvers. +% +This format allows several levels of detail, and is thus flexible enough to reasonably +easily produce proofs in various contexts. We intend to define a precise +semantics at each level though. +% +This distinguishes our format from other approaches, such as the TSTP +format~\cite{Sutcliffe2004}, that are probably easier to adopt but only +specify the syntax, leading to very different proofs generated by the various +provers supporting it. + +One limit of our approach for proofs is that we cannot express global +transformations like symmetry breaking. SAT solvers are able to add clauses +(DRAT clauses) such that the overall problems is equisatisfiable. It is unclear +however how to add such clauses in the SMT context. + +Overall, we hope to get feedback from users and developers to see what special +needs they have and exchange ideas on the proof format. + +\paragraph{Acknowledgment} +We thank Bruno Andreotti for ongoing work on the proof checker and +Hanna Lachnitt for ongoing work on the cvc5 support. +We are grateful for the helpful comments provided to us by the anonymous +reviewers. +The first author has received funding from the European Research Council (ERC) +under the European Union’s Horizon 2020 research and innovation program (grant +agreement No. 713999, Matryoshka). +The second author is supported by the LIT AI Lab funded by the State of Upper Austria. + +\bibliographystyle{eptcs} +\bibliography{generic} + +\end{document} diff --git a/publications/pxtp21/generic.bib b/publications/pxtp21/generic.bib new file mode 100644 index 0000000000000000000000000000000000000000..5a2d13ed3197d7aa60ab47cd80ba3a3af80f2ec5 --- /dev/null +++ b/publications/pxtp21/generic.bib @@ -0,0 +1,241 @@ +@string{lncs = "LNCS"} +@string{cpp = "Certified Programs and Proofs"} +@string{cav = "Computer Aided Verification (CAV)"} + +@inproceedings{besson-2011, + title = {A Flexible Proof Format for {SMT}: A Proposal}, + author = {Besson, Fr{\'e}d{\'e}ric and Fontaine, Pascal and Th{\'e}ry, Laurent}, + editor = "Pascal Fontaine and Aaron Stump", + booktitle = {PxTP 2011}, + year = {2011}, + pages = "15--26", + MONTH = Aug, +} + +@inproceedings{deharbe-2011, + TITLE = {Quantifier Inference Rules for {SMT} Proofs}, + AUTHOR = {D{\'e}harbe, David and Fontaine, Pascal and Woltzenlogel Paleo, Bruno}, + editor = "Pascal Fontaine and Aaron Stump", + BOOKTITLE = {PxTP 2011}, + YEAR = {2011}, + pages = "33--39", + MONTH = Aug, +} + +@article{barrett-2015, + title={Proofs in satisfiability modulo theories}, + author={Barrett, Clark and De Moura, Leonardo and Fontaine, Pascal}, + journal={All about proofs, Proofs for all}, + volume={55}, + number={1}, + pages={23--44}, + year={2015}, + publisher={Citeseer} +} + +@article{barbosa-2019, + title = "Scalable Fine-Grained Proofs for Formula Processing", + journal = "Journal of Automated Reasoning", + year = {2019}, + month = jan, + author = "Barbosa, Haniel + and Blanchette, Jasmin C. + and Fleury, Mathias + and Fontaine, Pascal", + publisher = "Springer", + doi = {10.1007/s10817-018-09502-y} +} + +@TECHREPORT{SMTLIB, + author = {Clark Barrett and Pascal Fontaine and Cesare Tinelli}, + title = {{The SMT-LIB Standard: Version 2.6}}, + institution = {Department of Computer Science, The University of Iowa}, + year = 2017, + note = {Available at {\tt www.SMT-LIB.org}} +} + +@inproceedings{verit, + author = {Thomas Bouton + and Diego C. B. de Oliveira + and David D{\'{e}}harbe + and Pascal Fontaine}, + title = {{veriT}: An Open, Trustable and Efficient {SMT}-solver}, + booktitle = "CADE 22", + pages = {151--156}, + year = {2009}, + editor = {Renate A. Schmidt}, + series = lncs, + volume = {5663}, + publisher = "Springer Berlin Heidelberg", + doi = {10.1007/978-3-642-02959-2\_12} +} + +@InProceedings{SMTCoq, + author = "Ekici, Burak + and Mebsout, Alain + and Tinelli, Cesare + and Keller, Chantal + and Katz, Guy + and Reynolds, Andrew + and Barrett, Clark", + editor = "Majumdar, Rupak + and Kun{\v{c}}ak, Viktor", + title = "{SMTC}oq: A Plug-In for Integrating {SMT} Solvers into {C}oq", + booktitle = "CAV 2017", + series = lncs, + volume = {10426}, + year = "2017", + publisher = "Springer", + pages = "126--133", + isbn = "978-3-319-63390-9", + doi = {10.1007/978-3-319-63390-9\_7} +} + +@inproceedings{fleury-2019, + author = {Mathias Fleury and + Hans{-}J{\"{o}}rg Schurr}, + editor = {Giselle Reis and + Haniel Barbosa}, + title = {Reconstructing {veriT} Proofs in {Isabelle/HOL}}, + booktitle = {PxTP 2019}, + series = {{EPTCS}}, + volume = {301}, + pages = {36--50}, + year = {2019}, + doi = {10.4204/EPTCS.301.6}, +} + +@inproceedings{schurr-2021, + author = { + Hans-Jörg Schurr and Mathias Fleury and Martin Desharnais + }, + title = {Reliable Reconstruction of Fine-Grained Proofs in a Proof Assistant}, + booktitle = "CADE 28", + year = {2021}, + series = lncs, +} + +@inproceedings{Armand2011, + author = {Micha{\"e}l Armand and + Germain Faure and + Benjamin Gr{\'e}goire and + Chantal Keller and + Laurent Th{\'e}ry and + Benjamin Werner}, + title = {A~Modular Integration of {SAT}\slash{SMT} Solvers to {Coq} through + Proof Witnesses}, + booktitle = cpp, + pages = {135--150}, + editor = {Jean-Pierre Jouannaud and + Zhong Shao}, + publisher = {Springer}, + series = lncs, + volume = {7086}, + year = {2011}, + doi = {10.1007/978-3-642-25379-9_12} +} + +@incollection{Barrett2018, + author = {Clark W. Barrett and + Cesare Tinelli}, + title = {Satisfiability Modulo Theories}, + booktitle = {Handbook of Model Checking.}, + pages = {305--343}, + year = {2018}, + XXurl = {https://doi.org/10.1007/978-3-319-10575-8\_11}, + doi = {10.1007/978-3-319-10575-8\_11}, + timestamp = {Mon, 24 Jun 2019 15:54:17 +0200}, + biburl = {https://dblp.org/rec/bib/reference/mc/BarrettT18}, + bibsource = {dblp computer science bibliography, https://dblp.org}, + editor = {Edmund M. Clarke and + Thomas A. Henzinger and + Helmut Veith and + Roderick Bloem}, + publisher = {Springer}, +} + +@inproceedings{Barrett2011, +author="Barrett, Clark +and Conway, Christopher L. +and Deters, Morgan +and Hadarean, Liana +and Jovanovi{\'{c}}, Dejan +and King, Tim +and Reynolds, Andrew +and Tinelli, Cesare", +editor="Gopalakrishnan, Ganesh +and Qadeer, Shaz", +title={{CVC4}}, +booktitle=cav, +year="2011", +publisher="Springer", +pages="171--177", +doi="10.1007/978-3-642-22110-1_14", +XXurl="http://dx.doi.org/10.1007/978-3-642-22110-1_14" +} + +@article{Stump2013, + author = {Aaron Stump and + Duckki Oe and + Andrew Reynolds and + Liana Hadarean and + Cesare Tinelli}, + title = {{SMT} proof checking using a logical framework}, + journal = {Formal Methods in System Design}, + volume = {42}, + number = {1}, + pages = {91--118}, + year = {2013}, + XXurl = {http://dx.doi.org/10.1007/s10703-012-0163-3}, + doi = {10.1007/s10703-012-0163-3}, + timestamp = {Fri, 11 Jan 2013 11:14:23 +0100}, + biburl = {http://dblp.uni-trier.de/rec/bib/journals/fmsd/StumpORHT13}, + bibsource = {dblp computer science bibliography, http://dblp.org} +} + +@inproceedings{Sutcliffe2004, + author = {Geoff Sutcliffe and J{\"u}rgen Zimmer and Stephan Schulz}, + title = "{TSTP} Data-Exchange Formats for Automated Theorem Proving Tools", + editor = "Weixiong Zhang and Volker Sorge", + booktitle = "Distributed Constraint Problem Solving and Reasoning in Multi-Agent Systems", + series = "Frontiers in Artificial Intelligence and Applications", + volume = 112, + pages = "201--215", + publisher = "IOS Press", + year = 2004} + +@article{Downey1980, + author = {Downey, Peter J. and Sethi, Ravi and Tarjan, Robert Endre}, + title = {Variations on the Common Subexpression Problem}, + journal = {J. ACM}, + issue_date = {Oct. 1980}, + volume = {27}, + number = {4}, + month = oct, + year = {1980}, + issn = {0004-5411}, + pages = {758--771}, + numpages = {14}, + XXurl = {http://doi.acm.org/10.1145/322217.322228}, + doi = {10.1145/322217.322228}, + acmid = {322228}, + publisher = {ACM}, + address = {New York, NY, USA}, +} + +@article{Nelson1980, + author = {Nelson, Greg and Oppen, Derek C.}, + title = {{Fast Decision Procedures Based on Congruence Closure}}, + journal = {J. ACM}, + issue_date = {April 1980}, + volume = {27}, + number = {2}, + year = {1980}, + issn = {0004-5411}, + pages = {356--364}, + numpages = {9}, + XXurl = {http://doi.acm.org/10.1145/322186.322198}, + doi = {10.1145/322186.322198}, + acmid = {322198}, + publisher = {ACM}, +} diff --git a/publications/pxtp21/orcid.pdf b/publications/pxtp21/orcid.pdf new file mode 100755 index 0000000000000000000000000000000000000000..b348975bce5714a33b4a2a464e999297b998d64f Binary files /dev/null and b/publications/pxtp21/orcid.pdf differ diff --git a/publications/pxtp21/smtlib2.py b/publications/pxtp21/smtlib2.py new file mode 100755 index 0000000000000000000000000000000000000000..833869fcaa86542c8109e9dcaa28c5fbd4c6371b --- /dev/null +++ b/publications/pxtp21/smtlib2.py @@ -0,0 +1,119 @@ +# -*- coding: utf-8 -*- + +import re + +from pygments.lexer import Lexer, RegexLexer, bygroups, do_insertions, \ + default, include +from pygments.token import Text, Comment, Operator, Keyword, Name, String, \ + Number, Punctuation, Generic +from pygments import unistring as uni + +__all__ = ['Smt2Lexer'] + + +line_re = re.compile('.*?\n') + +class CustomLexer(RegexLexer): + """ + A SMT-Lib 2 parser + """ + name = 'Smt2' + aliases = ['smt2'] + filenames = ['*.smt2'] + mimetypes = ['text/x-smt2'] + + # list of known keywords and builtins taken form vim 6.4 scheme.vim + # syntax file. + keywords = ( + 'declare-const', 'declare-fun', 'declare-sort', 'define-fun', 'assert', 'check-sat', + 'get-model', 'get-proof', 'get-value', 'echo', 'exit', 'error', + 'sat', 'unsat', 'unknown', 'model', 'set-option', 'set-logic', + 'anchor', 'step', 'assume', 'input' + ) + sorts = ( + 'Int', 'Bool' + ) + builtins = ( + '*', '+', '-', '/', '<', '<=', '=', '>', '>=', 'and', 'or', 'distinct', + 'not', ':=', 'forall', 'exists', 'cl' + ) + + # valid names for identifiers + # well, names can only not consist fully of numbers + # but this should be good enough for now + valid_name = r'[\w\.!$%&*+,/:<=>?@^~|-]+' + + tokens = { + 'root': [ + # the comments + # and going to the end of the line + (r';.*$', Comment.Single), + # multi-line comment + (r'#\|', Comment.Multiline, 'multiline-comment'), + # commented form (entire sexpr folliwng) + (r'#;\s*\(', Comment, 'commented-form'), + # signifies that the program text that follows is written with the + # lexical and datum syntax described in r6rs + (r'#!r6rs', Comment), + + # whitespaces - usually not relevant + (r'\s+', Text), + + # numbers + (r'-?\d+\.\d+', Number.Float), + (r'-?\d+', Number.Integer), + # support for uncommon kinds of numbers - + # have to figure out what the characters mean + # (r'(#e|#i|#b|#o|#d|#x)[\d.]+', Number), + + # strings, symbols and characters + (r'"(\\\\|\\"|[^"])*"', String), + (r"'" + valid_name, String.Symbol), + (r"#\\([()/'\"._!§$%& ?=+-]|[a-zA-Z0-9]+)", String.Char), + + # constants + (r'(true|false)', Name.Constant), + + # special operators + (r"('|#|`|,@|,)", Operator), + + # highlight the keywords + ('(%s)' % '|'.join(re.escape(entry) for entry in keywords), + Keyword.Reserved), + + # highlight the sorts + ('(%s)' % '|'.join(re.escape(entry) for entry in sorts), + Keyword.Type), + + # first variable in a quoted string like + # '(this is syntactic sugar) + (r"(?<='\()" + valid_name, Name.Variable), + (r"(?<=#\()" + valid_name, Name.Variable), + + # highlight the builtins + ("(?<=\()(%s)" % '|'.join(re.escape(entry) + '\s+' for entry in builtins), + Name.Builtin), + + (r':' + valid_name, Name.Function), + + # the remaining functions + #(r'(?<=\()' + valid_name, Name.Function), + # find the remaining variables + (valid_name, Name.Variable), + + # the famous parentheses! + (r'(\(|\))', Punctuation), + (r'(\[|\])', Punctuation), + ], + 'multiline-comment': [ + (r'#\|', Comment.Multiline, '#push'), + (r'\|#', Comment.Multiline, '#pop'), + (r'[^|#]+', Comment.Multiline), + (r'[|#]', Comment.Multiline), + ], + 'commented-form': [ + (r'\(', Comment, '#push'), + (r'\)', Comment, '#pop'), + (r'[^()]+', Comment), + ], + } diff --git a/spec/doc.tex b/spec/doc.tex index 7f35786f6c087711657b91f2651a2256013ae719..afcd205582aa1ab2a2c51e7a6f1ca4723a745bed 100644 --- a/spec/doc.tex +++ b/spec/doc.tex @@ -269,7 +269,7 @@ break % ======================================== \title{The {\formatName} Proof Format} -\subtitle{A Speculative Specification and Reference} +\subtitle{A Speculative Specification and Reference\\(Work in Progress)} \author{Haniel Barbosa\textsuperscript{1} \and Mathias Fleury\textsuperscript{2} \and Pascal Fontaine\textsuperscript{3} @@ -610,6 +610,51 @@ of $(x+y<1) \lor (3<x)$, $x\simeq 2$, and $0\simeq y$. % x < 0 , 1 = x --> 1 1 gives 1 < 0 % this should somehow be fixed +\paragraph{Subproofs and Lemmas.} +The proof format uses subproof to prove lemmas and to manipulate the context. +To prove lemmas, a subproof can +introduce local assumptions. The subproof \emph{rule} discharges the +local assumptions by concluding with an implication (written as a clause) +which has the local assumptions as its antecedents. +A step can only use steps from the same subproof as its premise. It +is not possible to have premises from either a subproof at a deeper +level or from an outer level.%\todo{We could technically allow premises from +%outside. Do we allow this?} + +As the example below shows, our notation for subproofs is a +frame around the rules within the subproof. Subproofs are also used to +manipulate the context. + +\begin{example} This example show a contradiction proof for the +formula \((2 + 2) \simeq 5\). The proof uses a subproof to prove the +lemma \(((2 + 2) \simeq 5) \Rightarrow 4 \simeq 5\). + +\begin{plContainer} +\begin{plList} +\proofsep& 1.& (2 + 2) \simeq 5 &(\proofRule{assume})\\ +\end{plList} +\begin{plSubList} +\proofsep& 2.& (2 + 2) \simeq 5 &(\proofRule{assume})\\ +\proofsep& 3.& (2 + 2) \simeq 4 &(\proofRule{plus\_simplify})\\ +\proofsep& 4.& 4 \simeq 5 &(\proofRule{trans}; 1, 2)\\ +\end{plSubList} +\begin{plList} +\proofsep& 5.& \neg((2 + 2) \simeq 5), 4 \simeq 5 &(\proofRule{subproof})\\ +\proofsep& 6.& (4 \simeq 5)\leftrightarrow \bot &(\proofRule{eq\_simplify})\\ +\proofsep& 7.& \neg((4 \simeq 5)\leftrightarrow \bot), \neg(4\simeq 5), \bot &(\proofRule{equiv\_pos2})\\ +\proofsep& 8.& \bot &(\proofRule{resolution}; 1, 5, 7, 8)\\ +\end{plList} +\end{plContainer} + +\end{example} + +\paragraph{Contexts.} +A specialty of the veriT proof +format is the step context. The context is a possible empty list $[c_1, +\dots, c_l]$, where $c_i$ is either a variable or a variable-term tuple +denoted $x_i\mapsto t_i$. Throughout this document $\Gamma$ denotes +an arbitrary context. The context denotes a substitution.%\todo{Extend} + \paragraph{Skolemization and Other Preprocessing Steps.} One typical example for a rule with context is the \proofRule{sko\_ex} rule, which is used to express Skolemization of an existentially