【问题标题】:How to convert many-valued logic into efficient boolean logic?如何将多值逻辑转换为高效的布尔逻辑?
【发布时间】:2018-02-17 23:41:09
【问题描述】:

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

  • S < 0 当且仅当 S 为负时才返回一个。
  • ¯S 返回 S 的否定。
  • S + 0 返回 S 加零,即 S 不变。
  • S + 1 返回 S 的绝对值加一,以下标为模。例如:
    • ¯1₃ + 1 和 1₃ + 1 都计算为 2₃。
    • ¯2₃ + 1 和 2₃ + 1 都计算为 0₃。
    • 表达式0₃ + 1 的计算结果为1₃。
  • S ¢ 0 返回 S + 0 的 carry,它为零。
  • 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₄。求解得到的 Karnaugh map 以得到 CNF 或 DNF 表达式并收工。

不幸的是,对于 S 到布尔值的这种幼稚映射,生成的 CNF 或 DNF 表达式可能效率不高。我想找到将这个多值真值表表示为布尔真值表的最有效方法。在这里,高效意味着使用最少的运算符来实现各种运算,优先考虑加法、求反、进位和比较。然而,问题在于有16! 或20922789888000 方法将S 映射到布尔值。有没有比暴力破解更好的方法?

【问题讨论】:

  • 不应该把1和0加到左边栏吗?
  • 我不明白你的意思。
  • 我的意思是1 和0 也应该是逻辑值。 1₂ + 0 是 1₂,但 1 + 0 是什么?顺便说一句,是否允许移位运算符?
  • 它们属于不同的集合。 1₂ 属于集合S 而1 和0 属于集合B 的布尔值。 + 操作要求其左操作数属于集合S,其右操作数属于集合B。 + 操作的结果是来自集合 S 的值。
  • 没有。不允许使用位移运算符,因为每个位都将单独存储。这样做的原因是为了并行。例如,给定S 值的矩阵,所有高位都存储在一个位数组中,所有低位都存储在另一个位数组中,等等。因此,位移运算符将在矩阵的值之间移动位。这个想法是使用按位运算来执行卷积。

标签: logic boolean-logic karnaugh-map


【解决方案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₂ 解决这个问题。但是,我们希望以解决方案相似的方式来做到这一点。因此,当我们组合它们时,我们可以利用相似性来减少所涉及的操作数量。这是我想出的解决方案:

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

  1. 所有零元素都属于C'D' 列。因此,使用C+D 很容易选择其余元素。这稍后会派上用场。
  2. 负元素始终位于B 行中,并且与对应的正元素位于同一列。这使得否定和检查是否否定变得容易。

无论如何,这里是使用位运算符实现的操作,其中(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,对于加法我们不需要修改A。 Common subexpression elimination 和 xor 操作用于 reduce 操作。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    相关资源
    最近更新 更多