我如何以这种方式显示命题逻辑的验证?

我如何以这种方式显示命题逻辑的验证?

我想要排版类似下图的东西。

在此处输入图片描述

我想出了

\documentclass[oneside,12pt]{article}
\usepackage{microtype}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{amsmath}
\begin{document}
\[
  \begin{aligned}
    &\neg&(P &\wedge&R)\\
    &T&&F&\\
  \end{aligned}
\]
\end{document}

我怎样才能排版如上所示的表格?

答案1

不幸的是,LaTeX 对逻辑的支持并不好。至少,如果支持的话,我还没有找到支持。一切似乎总是涉及到针对其他问题的解决方案,并让它做其他事情。

如果您有耐心,可以使用类似的东西。我发现它tabular比数学环境麻烦少,因为无论如何,所有的 Ts、Fs、Ps、Qs 等都需要使用本质上是文本字体的东西。(至少如果您的文本字体也用于数学模式下的运算符等,这是很常见的。)并且切换到数学模式进行其他操作比\text{}一直输入文本模式要轻松得多。

\documentclass[oneside,12pt]{article}
\usepackage{microtype}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{amsmath}
\begin{document}
  \begin{tabular}{*{4}{c}|r@{}ccc@{\thinspace}r@{}*{3}{c}@{\thinspace}c@{}lcr@{}*{3}{c}@{\thinspace}c@{\thinspace}c@{}l}
  P&Q&R&S&$(\{$&S&$\land$&$\lnot$&$($&Q &$\land$& $\lnot$&P&$)\}$&$\lor$&$\{$&R&$\lor$&$\lnot$&$\lnot$&Q&$\})$\\\hline
  T&F&F&F& &F&F&T&& F&F&F&T &&F &&F&F&F&T&F\\
\end{tabular}
\end{document}

真值表线

有些脚本可以为你生成表格,但是如果你正在学习逻辑学,那就没用了,因为你需要自己弄清楚表格。另一方面,如果你正在教逻辑学,它们会非常有用。它们也不会进行我在这里提到的间距调整。至少,我使用的那个没有。

答案2

只要完成一些幕后工作,您就可以用相当自然的语法输入真值表。

\documentclass{article}
\usepackage{xparse,array}

\ExplSyntaxOn
\NewDocumentCommand{\truthtable}{mm}
 {
  \group_begin:
  \setlength{\arraycolsep}{0pt}
  \crocket_truth_make_preamble:n { #1 }
  \crocket_truth_make_body:n { #2 }
  \crocket_truth_make:
  \group_end:
 }

% variables
\tl_new:N \l__crocket_truth_preamble_tl
\tl_new:N \l__crocket_truth_first_tl
\tl_new:N \l__crocket_truth_body_tl
\seq_new:N \l__crocket_truth_rows_seq

% internal functions
\cs_new_protected:Nn \crocket_truth_make_preamble:n
 {
  \tl_clear:N \l__crocket_truth_preamble_tl
  \tl_clear:N \l__crocket_truth_first_tl
  % examine the first argument in order to build the table
  % preamble and the first row
  \tl_map_inline:nn { #1 }
   {
    \tl_if_in:VnTF \c_crocket_truth_delims_tl { ##1 }
     {% a delimiter is inserted in @{...} as a phantom (almost)
      % and not taken into account for the first row
      \tl_put_right:Nn \l__crocket_truth_preamble_tl { @{ \__crocket_truth_delim:n {##1} } }
     }
     {
      \tl_if_eq:nnTF { | } { ##1 }
       {% vertical bar is ignored in the rows, but it gives a | in
        % the table preamble (actually, quad | quad)
        \tl_put_right:Nn \l__crocket_truth_preamble_tl { @{\hspace{1em}}|@{\hspace{1em}} }
       }
       {% otherwise, c is added to the table preamble and
        % the item to the first row
        \tl_put_right:Nn \l__crocket_truth_preamble_tl { c }
        \tl_put_right:Nn \l__crocket_truth_first_tl { ##1 & }
       }
     }
   }
  % since rows will end with &, we add a dummy trailing column
  \tl_put_right:Nn \l__crocket_truth_preamble_tl { c } % empty last column
 }

\cs_new_protected:Nn \crocket_truth_make_body:n
 {% start building the table body
  \tl_clear:N \l__crocket_truth_body_tl
  % split the argument at \\
  \seq_set_split:Nnn \l__crocket_truth_rows_seq { \\ } { #1 }
  % and map it
  \seq_map_inline:Nn \l__crocket_truth_rows_seq
   {% each item is a row; map it to add &
    \tl_map_inline:nn { ##1 }
     {% but ignoring |
      \tl_if_eq:nnF { | } { ####1 }
       {
        \tl_put_right:Nn \l__crocket_truth_body_tl { \crocket_truth_tf:n { ####1 } & }
       }
     }
    % append the row terminator
    \tl_put_right:Nn \l__crocket_truth_body_tl { \\ }
   }
 }

\cs_new_protected:Nn \crocket_truth_make:
 {% make the table
  \exp_args:NnV \begin {array} \l__crocket_truth_preamble_tl
  % temporary define \__crocket_truth_delim:n to produce its argument
  \noalign { \cs_gset_eq:NN \__crocket_truth_delim:n \use:n }
  % output the first row
  \tl_use:N \l__crocket_truth_first_tl \\
  \hline
  % make \__crocket_truth_delim:n to deliver a phantom
  \noalign { \cs_gset_eq:NN \__crocket_truth_delim:n \hphantom }
  \tl_use:N \l__crocket_truth_body_tl
  \end{array}
 }

\cs_new_protected:Nn \crocket_truth_tf:n { \makebox[1.2em]{ $ \mathrm { #1 }$ } }

\tl_const:Nn \c_crocket_truth_delims_tl { ()[]\{\} }

\ExplSyntaxOff



\begin{document}

\[
\truthtable{
  P Q | (P \land Q)\lor P
}{
  T T | T T T T T\\
  T F | T F F T T
}
\]

\[
\truthtable{
  P Q R S | (\{ S \land \lnot ( Q \land \lnot P )\} \lor \{ R \lor \lnot \lnot Q \})
}{
  T F F F | F F T F F F T F F F F T F\\
  T F F F | F F T F F F T F F F F T F\\
  T F F F | F F T F F F T F F F F T F\\
  T F F F | F F T F F F T F F F F T F
}
\]
\end{document}

在此处输入图片描述

答案3

另一种方法。在运算符后立即写入逻辑值:

\def\use#1#2{\kern-1.2pt
  {\kern2pt#1\kern2pt\over{\ifx^#2^\else\rm\ifcase#2 F\or T\fi\fi}}\kern-1.2pt }
\def\n#1{\use #1{}}                   
\def\P#1{\use P#1}  \def\Q#1{\use Q#1} \def\R#1{\use R#1}  \def\S#1{\use S#1}
\def\formula{\use{}{}\vrule\use{}{}}
\def\And#1{\use \wedge#1} \def\Or#1{\use \vee#1}  \def\Not#1{\use\neg#1}

$$
\P1 \Q0 \R0 \S0
\formula
\n(\n\{ \S0 \And0 \Not1 \n(\Q0 \And0 \Not0 \P1 \n)\n\}
\Or0 
\n\{ \R0 \Or0 \Not0 \Not1 \Q0 \n\}\n)
$$

\bye

相关内容