如何将多值逻辑转换为有效的布尔逻辑?

时间:2017-09-09 03:05:19

标签: logic boolean-logic karnaugh-map

假设我有一个由S组成的{0₁, ¯1₂, 0₂, 1₂, ¯2₃, ¯1₃, 0₃, 1₃, 2₃, ¯3₄, ¯2₄, ¯1₄, 0₄, 1₄, 2₄, 3₄}集。我想在S上定义以下操作:

  • S < 0当且仅当S为否定时才会返回一个。
  • ¯S返回S的否定。
  • S + 0返回S加零,S不变。
  • S + 1返回S的绝对值加1,以下标为模。例如:
    • ¯1₃ + 11₃ + 1都评估为2₃
    • ¯2₃ + 12₃ + 1都评估为0₃
    • 表达式0₃ + 1的计算结果为1₃
  • S ¢ 0,返回S + 0的{​​{3}},即零。
  • S ¢ 1返回S + 1的进位,当且仅当S + 1 = 0ₙn > 1时才会返回。

此信息可以以真值表的形式捕获:

  S  S<0 ¯S  S+0 S+1 S¢0 S¢1
┌───┬───┬───┬───┬───┬───┬───┐
│ 0₁│ 0 │ 0₁│ 0₁│ 0₁│ 0 │ 0 │
├───┼───┼───┼───┼───┼───┼───┤
│¯1₂│ 1 │ 1₂│¯1₂│ 0₂│ 0 │ 1 │
├───┼───┼───┼───┼───┼───┼───┤
│ 0₂│ 0 │ 0₂│ 0₂│ 1₂│ 0 │ 0 │
├───┼───┼───┼───┼───┼───┼───┤
│ 1₂│ 0 │¯1₂│ 1₂│ 0₂│ 0 │ 1 │
├───┼───┼───┼───┼───┼───┼───┤
│¯2₃│ 1 │ 2₃│¯2₃│ 0₃│ 0 │ 1 │
├───┼───┼───┼───┼───┼───┼───┤
│¯1₃│ 1 │ 1₃│¯1₃│ 2₃│ 0 │ 0 │
├───┼───┼───┼───┼───┼───┼───┤
│ 0₃│ 0 │ 0₃│ 0₃│ 1₃│ 0 │ 0 │
├───┼───┼───┼───┼───┼───┼───┤
│ 1₃│ 0 │¯1₃│ 1₃│ 2₃│ 0 │ 0 │
├───┼───┼───┼───┼───┼───┼───┤
│ 2₃│ 0 │¯2₃│ 2₃│ 0₃│ 0 │ 1 │
├───┼───┼───┼───┼───┼───┼───┤
│¯3₄│ 1 │ 3₄│¯3₄│ 0₄│ 0 │ 1 │
├───┼───┼───┼───┼───┼───┼───┤
│¯2₄│ 1 │ 2₄│¯2₄│ 3₄│ 0 │ 0 │
├───┼───┼───┼───┼───┼───┼───┤
│¯1₄│ 1 │ 1₄│¯1₄│ 2₄│ 0 │ 0 │
├───┼───┼───┼───┼───┼───┼───┤
│ 0₄│ 0 │ 0₄│ 0₄│ 1₄│ 0 │ 0 │
├───┼───┼───┼───┼───┼───┼───┤
│ 1₄│ 0 │¯1₄│ 1₄│ 2₄│ 0 │ 0 │
├───┼───┼───┼───┼───┼───┼───┤
│ 2₄│ 0 │¯2₄│ 2₄│ 3₄│ 0 │ 0 │
├───┼───┼───┼───┼───┼───┼───┤
│ 3₄│ 0 │¯3₄│ 3₄│ 0₄│ 0 │ 1 │
└───┴───┴───┴───┴───┴───┴───┘

我想要做的是将这个多值真值表转换为一个布尔真值表,以便我可以使用按位运算符来实现并行化操作。听起来很简单。将0000分配给0₁0001分配给¯1₂,......,1111分配给3₄。解决生成的carry以获得Karnaugh mapCNF表达式并将其称为一天。

不幸的是,使用S到布尔值的这种天真映射,生成的CNF或DNF表达式可能效率不高。我想找到一种最有效的方法来将这个多值真值表表示为一个布尔真值表。这里,有效地意味着使用最少的运算符来实现各种操作,优选地按顺序添加,否定,进位和比较。但问题是,有16!20922789888000种方式将S映射到布尔值。找到解决方案是否有比蛮力更好的方法?

1 个答案:

答案 0 :(得分:1)

我无法想到这个问题的一般解决方案,但这是我的问题的具体解决方案。我们首先将集S潜入两个不相交的集S₁S₂。集S₁将包含0₁和下标元素。集S₂将包含下标和下标元素:

S₁ = {0₁, ¯3₄, ¯2₄, ¯1₄, 0₄, 1₄, 2₄, 3₄}
S₂ = {¯1₂, 0₂, 1₂, ¯2₃, ¯1₃, 0₃, 1₃, 2₃}
S  = S₁ ∪ S₂

现在,我们可以分别为S₁S₂解决此问题。但是,我们希望以解决方案类似的方式来实现。因此,当我们将它们组合时,我们可以利用相似性来减少所涉及的操作数量。这是我提出的解决方案:

Solution

关于我的解决方案,有两点需要注意:

  1. 所有零元素都属于C'D'列。因此,使用C+D可以轻松选择其余元素。这将在以后派上用场。
  2. 负面元素始终位于B行中,与相应的正元素位于同一列中。这使得否定和检查是否容易消极。
  3. 无论如何,这里是使用按位运算符实现的操作(A, B, C, D) ∈ S

    (A, B, C, D) < 0 = B (C + D)
    
    ¯(A, B, C, D)    = (A, B ^ (C + D), C, D)
    
    (A, B, C, D) + M =
        E = C D
        N = M'
        (A, B N + M E,
            C N + M (A ^ C ^ D ^ A E),
            D N + M D' (B + C))
    
    (A, B, C, D) ¢ M = M D (A + C)
    

    添加,携带,否定和比较所需的操作次数分别为18,3,2和2。请注意,对于否定,我们只需要修改B,另外我们不需要修改ACommon subexpression elimination和xor操作用于减少操作。

    我不知道是否可以做得比这更好。这是我提出的最佳解决方案。