Supposons que j'ai un ensemble S
composé de {0₁, ¯1₂, 0₂, 1₂, ¯2₃, ¯1₃, 0₃, 1₃, 2₃, ¯3₄, ¯2₄, ¯1₄, 0₄, 1₄, 2₄, 3₄}
. Je veux définir les opérations suivantes sur S
:Comment convertir une logique à plusieurs valeurs en une logique booléenne efficace?
S < 0
qui retourne un si et seulement siS
est négatif.¯S
qui renvoie la négation deS
.S + 0
qui renvoieS
plus zéro, qui estS
inchangé.S + 1
qui renvoie la valeur absolue deS
plus un, modulo l'indice. Par exemple:- Les deux
¯1₃ + 1
et1₃ + 1
évaluent à2₃
. - Les deux
¯2₃ + 1
et2₃ + 1
évaluent à0₃
. L'expression0₃ + 1
est évaluée à1₃
.
- Les deux
S ¢ 0
qui renvoie le carry deS + 0
, qui est égal à zéro.S ¢ 1
qui renvoie le report deS + 1
, qui est un si et seulement siS + 1 = 0ₙ
pourn > 1
.
Ces informations peuvent être capturées sous la forme d'une table de vérité:
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 │
└───┴───┴───┴───┴───┴───┴───┘
Ce que je veux faire est de convertir cette table de vérité de valeurs multiples dans une table de vérité booléenne pour que je puisse mettre en œuvre la opérations utilisant des opérateurs au niveau du bit pour la parallélisation. Cela semble assez simple. Attribuez 0000
à 0₁
, 0001
à ¯1₂
, ..., 1111
à 3₄
. Résolvez le résultat Karnaugh map pour obtenir une expression CNF ou DNF et appelez-le un jour. Malheureusement, les expressions CNF ou DNF résultantes peuvent ne pas être efficaces avec ce mappage naïf de S
aux valeurs booléennes. Je veux trouver le moyen le plus efficace de représenter cette table de vérité à valeurs multiples comme une table de vérité booléenne. Ici, le moyen efficace consiste à utiliser le moins d'opérateurs pour mettre en œuvre les différentes opérations, en privilégiant l'addition, la négation, le report et la comparaison dans cet ordre. Cependant, le problème est qu'il existe 16!
ou 20922789888000
façons de mapper S
aux valeurs booléennes. Existe-t-il un meilleur moyen de trouver la solution que la force brute?
Ne devriez-vous pas ajouter «1» et «0» à la colonne de gauche? –
Je ne comprends pas ce que vous voulez dire. –
Je veux dire que '1' et' 0' devraient aussi être des valeurs logiques. '1₂ + 0' est' 1₂', mais qu'est-ce que '1 + 0'? En passant, les opérateurs de bits sont-ils autorisés? –