关于使用Mathematica打印逻辑表的问题

nil*_*ock 5 wolfram-mathematica

背景:另见:http://mathworld.wolfram.com/TruthTable.html

Mathematica提供以下功能.

 TruthTable[op_, n_] := 
  Module[{l = 
     Flatten[Outer[List, Sequence @@ Table[{True, False}, {n}]], 
      n - 1], a = Array[A, n]}, 
   DisplayForm[
    GridBox[Prepend[Append[#, op @@ #] & /@ l, Append[a, op @@ a]], 
     RowLines -> True, ColumnLines -> True]]]
Run Code Online (Sandbox Code Playgroud)

我打印了一张nand表如下:

 TruthTable[Not[And[#1, #2]] &, 2]

 A[1]   A[2]    !(A[1]&&A[2])
 True   True    False
 True   False   True
 False  True    True
 False  False   True
Run Code Online (Sandbox Code Playgroud)

这是预期的,除了标题,我想用P,Q或A,B作为变量.

  • 问题:我不太了解代码中A的使用.请评论.(也许我使用的功能不正确?)

Sim*_*mon 11

提供的代码不允许您为逻辑运算中的变量选择符号或符号列表.它只是构造一个表单变量列表{A[1],...,A[n]}.

对代码进行最小修改以允许用户提供的变量列表(以及一些基本的参数检查)就像这样

TruthTable[op_, n_Integer?Positive, symbs_List] := Module[{
   l = Flatten[Outer[List, Sequence @@ Table[{True, False}, {n}]], n - 1]}, 
  DisplayForm[GridBox[Prepend[Append[#, op @@ #] & /@ l, 
     Append[symbs, op @@ symbs]], RowLines -> True, 
    ColumnLines -> True]]] /; Length[symbs] == n

TruthTable[op_, n_Integer?Positive, symb_String: "A"] := 
 TruthTable[op, n, Array[Symbol[symb], n]]
Run Code Online (Sandbox Code Playgroud)

第一个定义将打印任何给定变量列表的真值表(可以是任何表达式,但简单的符号或字符串看起来最合理).如果给出两个参数,则第二个定义与您提供的原始代码完全相同,可选的第三个参数是构造真值表中使用的符号的字符串.

然后nand真值表可以打印为

TruthTable[Not[And[#1, #2]] &, 2, {P, Q}]
Run Code Online (Sandbox Code Playgroud)

NAND

看起来好一点 TraditionalForm

TruthTable[Not[And[#1, #2]] &, 2, {P, Q}] // TraditionalForm
Run Code Online (Sandbox Code Playgroud)

nand v2

如果你使用内置的Nand操作员(这只是一个很好的形式Not[And[##]]&),甚至更整洁

TruthTable[Nand, 3, {P, Q, R}] // TraditionalForm
Run Code Online (Sandbox Code Playgroud)

nand v3


在反射时,如果您提供明确的变量列表,nTruthTable函数中的整数参数可能有点多余.我将它作为练习留给读者来修改功能,以便它可以在没有它的情况下工作...... :)