884 |
884 |
885 \begin{enum} |
885 \begin{enum} |
886 \item[$\bullet$] \textbf{\textit{erased} (very unsound):} No type information is |
886 \item[$\bullet$] \textbf{\textit{erased} (very unsound):} No type information is |
887 supplied to the ATP. Types are simply erased. |
887 supplied to the ATP. Types are simply erased. |
888 |
888 |
889 \item[$\bullet$] \textbf{\textit{poly\_preds} (sound):} Types are encoded using |
889 \item[$\bullet$] \textbf{\textit{poly\_guards} (sound):} Types are encoded using |
890 a predicate \textit{has\_\allowbreak type\/}$(\tau, t)$ that restricts the range |
890 a predicate \textit{has\_\allowbreak type\/}$(\tau, t)$ that guards bound |
891 of bound variables. Constants are annotated with their types, supplied as extra |
891 variables. Constants are annotated with their types, supplied as additional |
892 arguments, to resolve overloading. |
892 arguments, to resolve overloading. |
893 |
893 |
894 \item[$\bullet$] \textbf{\textit{poly\_tags} (sound):} Each term and subterm is |
894 \item[$\bullet$] \textbf{\textit{poly\_tags} (sound):} Each term and subterm is |
895 tagged with its type using a function $\mathit{type\_info\/}(\tau, t)$. |
895 tagged with its type using a function $\mathit{type\_info\/}(\tau, t)$. |
896 |
896 |
897 \item[$\bullet$] \textbf{\textit{poly\_args} (unsound):} |
897 \item[$\bullet$] \textbf{\textit{poly\_args} (unsound):} |
898 Like for \textit{poly\_preds} constants are annotated with their types to |
898 Like for \textit{poly\_guards} constants are annotated with their types to |
899 resolve overloading, but otherwise no type information is encoded. This |
899 resolve overloading, but otherwise no type information is encoded. This |
900 coincides with the default encoding used by the \textit{metis} command. |
900 coincides with the default encoding used by the \textit{metis} command. |
901 |
901 |
902 \item[$\bullet$] |
902 \item[$\bullet$] |
903 \textbf{% |
903 \textbf{% |
904 \textit{mono\_preds}, \textit{mono\_tags} (sound); |
904 \textit{mono\_guards}, \textit{mono\_tags} (sound); |
905 \textit{mono\_args} (unsound):} \\ |
905 \textit{mono\_args} (unsound):} \\ |
906 Similar to \textit{poly\_preds}, \textit{poly\_tags}, and \textit{poly\_args}, |
906 Similar to \textit{poly\_guards}, \textit{poly\_tags}, and \textit{poly\_args}, |
907 respectively, but the problem is additionally monomorphized, meaning that type |
907 respectively, but the problem is additionally monomorphized, meaning that type |
908 variables are instantiated with heuristically chosen ground types. |
908 variables are instantiated with heuristically chosen ground types. |
909 Monomorphization can simplify reasoning but also leads to larger fact bases, |
909 Monomorphization can simplify reasoning but also leads to larger fact bases, |
910 which can slow down the ATPs. |
910 which can slow down the ATPs. |
911 |
911 |
912 \item[$\bullet$] |
912 \item[$\bullet$] |
913 \textbf{% |
913 \textbf{% |
914 \textit{mangled\_preds}, |
914 \textit{mangled\_guards}, |
915 \textit{mangled\_tags} (sound); \\ |
915 \textit{mangled\_tags} (sound); \\ |
916 \textit{mangled\_args} (unsound):} \\ |
916 \textit{mangled\_args} (unsound):} \\ |
917 Similar to |
917 Similar to |
918 \textit{mono\_preds}, \textit{mono\_tags}, and \textit{mono\_args}, |
918 \textit{mono\_guards}, \textit{mono\_tags}, and \textit{mono\_args}, |
919 respectively but types are mangled in constant names instead of being supplied |
919 respectively but types are mangled in constant names instead of being supplied |
920 as ground term arguments. The binary predicate $\mathit{has\_type\/}(\tau, t)$ |
920 as ground term arguments. The binary predicate $\mathit{has\_type\/}(\tau, t)$ |
921 becomes a unary predicate $\mathit{has\_type\_}\tau(t)$, and the binary function |
921 becomes a unary predicate $\mathit{has\_type\_}\tau(t)$, and the binary function |
922 $\mathit{type\_info\/}(\tau, t)$ becomes a unary function |
922 $\mathit{type\_info\/}(\tau, t)$ becomes a unary function |
923 $\mathit{type\_info\_}\tau(t)$. |
923 $\mathit{type\_info\_}\tau(t)$. |
924 |
924 |
925 \item[$\bullet$] \textbf{\textit{simple} (sound):} Exploit simple first-order |
925 \item[$\bullet$] \textbf{\textit{simple} (sound):} Exploit simple first-order |
926 types if the prover supports the TFF or THF syntax; otherwise, fall back on |
926 types if the prover supports the TFF or THF syntax; otherwise, fall back on |
927 \textit{mangled\_preds}. The problem is monomorphized. |
927 \textit{mangled\_guards}. The problem is monomorphized. |
928 |
928 |
929 \item[$\bullet$] \textbf{\textit{simple\_higher} (sound):} Exploit simple |
929 \item[$\bullet$] \textbf{\textit{simple\_higher} (sound):} Exploit simple |
930 higher-order types if the prover supports the THF syntax; otherwise, fall back |
930 higher-order types if the prover supports the THF syntax; otherwise, fall back |
931 on \textit{simple} or \textit{mangled\_preds\_heavy}. The problem is |
931 on \textit{simple} or \textit{mangled\_guards\_heavy}. The problem is |
932 monomorphized. |
932 monomorphized. |
933 |
933 |
934 \item[$\bullet$] |
934 \item[$\bullet$] |
935 \textbf{% |
935 \textbf{% |
936 \textit{poly\_preds}?, \textit{poly\_tags}?, \textit{mono\_preds}?, \textit{mono\_tags}?, \\ |
936 \textit{poly\_guards}?, \textit{poly\_tags}?, \textit{mono\_guards}?, \textit{mono\_tags}?, \\ |
937 \textit{mangled\_preds}?, \textit{mangled\_tags}?, \textit{simple}?, \textit{simple\_higher}? (quasi-sound):} \\ |
937 \textit{mangled\_guards}?, \textit{mangled\_tags}?, \textit{simple}? (quasi-sound):} \\ |
938 The type encodings \textit{poly\_preds}, \textit{poly\_tags}, |
938 The type encodings \textit{poly\_guards}, \textit{poly\_tags}, |
939 \textit{mono\_preds}, \textit{mono\_tags}, \textit{mangled\_preds}, |
939 \textit{mono\_guards}, \textit{mono\_tags}, \textit{mangled\_guards}, |
940 \textit{mangled\_tags}, \textit{simple}, and \textit{simple\_higher} are fully |
940 \textit{mangled\_tags}, and \textit{simple} are fully |
941 typed and sound. For each of these, Sledgehammer also provides a lighter, |
941 typed and sound. For each of these, Sledgehammer also provides a lighter, |
942 virtually sound variant identified by a question mark (`{?}')\ that detects and |
942 virtually sound variant identified by a question mark (`{?}')\ that detects and |
943 erases monotonic types, notably infinite types. (For \textit{simple} and |
943 erases monotonic types, notably infinite types. (For \textit{simple}, the types |
944 \textit{simple\_higher}, the types are not actually erased but rather replaced |
944 are not actually erased but rather replaced by a shared uniform type of |
945 by a shared uniform type of individuals.) As argument to the \textit{metis} |
945 individuals.) As argument to the \textit{metis} proof method, the question mark |
946 proof method, the question mark is replaced by a \hbox{``\textit{\_query}''} |
946 is replaced by a \hbox{``\textit{\_query}''} suffix. If the \emph{sound} option |
947 suffix. If the \emph{sound} option is enabled, these encodings are fully sound. |
947 is enabled, these encodings are fully sound. |
948 |
948 |
949 \item[$\bullet$] |
949 \item[$\bullet$] |
950 \textbf{% |
950 \textbf{% |
951 \textit{poly\_preds}!, \textit{poly\_tags}!, \textit{mono\_preds}!, \textit{mono\_tags}!, \\ |
951 \textit{poly\_guards}!, \textit{poly\_tags}!, \textit{mono\_guards}!, \textit{mono\_tags}!, \\ |
952 \textit{mangled\_preds}!, \textit{mangled\_tags}!, \textit{simple}!, \textit{simple\_higher}! \\ |
952 \textit{mangled\_guards}!, \textit{mangled\_tags}!, \textit{simple}!, \textit{simple\_higher}! \\ |
953 (mildly unsound):} \\ |
953 (mildly unsound):} \\ |
954 The type encodings \textit{poly\_preds}, \textit{poly\_tags}, |
954 The type encodings \textit{poly\_guards}, \textit{poly\_tags}, |
955 \textit{mono\_preds}, \textit{mono\_tags}, \textit{mangled\_preds}, |
955 \textit{mono\_guards}, \textit{mono\_tags}, \textit{mangled\_guards}, |
956 \textit{mangled\_tags}, \textit{simple}, and \textit{simple\_higher} also admit |
956 \textit{mangled\_tags}, \textit{simple}, and \textit{simple\_higher} also admit |
957 a mildly unsound (but very efficient) variant identified by an exclamation mark |
957 a mildly unsound (but very efficient) variant identified by an exclamation mark |
958 (`{!}') that detects and erases erases all types except those that are clearly |
958 (`{!}') that detects and erases erases all types except those that are clearly |
959 finite (e.g., \textit{bool}). (For \textit{simple} and \textit{simple\_higher}, |
959 finite (e.g., \textit{bool}). (For \textit{simple} and \textit{simple\_higher}, |
960 the types are not actually erased but rather replaced by a shared uniform type |
960 the types are not actually erased but rather replaced by a shared uniform type |