Fabien LE LEZ a écrit :
On Tue, 15 Jan 2008 14:32:25 +0100, Lea GRIS :
J'ai relu un peu de théorie sur les diagrammes de Karnaugh et d'algèbre
de Bool mais je ne sais pas très bien concrètement comment les appliquer
dans ce cas là.
Si tu fais le diagramme de Karnaugh de ta table, tu obtiens :
DDS DFS DFI DFT
00 01 11 10
00 EN OK OK OK
01 ND ND ND ND
11 EN OK OK OK
10 SU AN AN AN
Effectivement, en applicant directement la méthode usuelle, on
n'obtient à peu près rien.
Merci à toi Fabien, c'était un peu mon impression aussi ou alors j'ai
trop perdu de mes cours d'informatique d'il y a 20 ans :)
En fait je cherchais une approche de factorisation purement algébrique
par-ce que les diagrammes de Karnaugh ne sont pas évident à interpréter.
Faire des groupes de 8, 4, 2 sorties dans le cas présent et trouver des
intersections de ces groupes... faut avoir l'oeil.
Autrement :
Quelqu'un m'a soumis une alternative intéressante en utilisant
directement une table.
Je la retranscris ici en C99 :
#include <stdbool.h>
/* représentations binaire des différentes valeurs d'entrée
* en vue de leur assemblage comme index entier
*/
#DEFINE DFI 0x01
#DEFINE DFT 0x02
#DEFINE DDS 0x04
#DEFINE DFS 0x08
/* les différentes valeurs de sorties,
* ce sont des chaînes de caractères mais il serait aussi
* possible d'y ranger des pointeurs vers la fonction
* à appeler conditionnellement à la valeur d'index
*/
static char * sorties[ ] = { "OK","EN","SU","AN","ND" };
/* Table de vérités */
static unsigned int * verites[ ] = {1,4,2,1,0,4,3,0,0,4,3,0,0,4,3,0};
char * gettest(bool dfi,dft,dds,dfs)
{
/* Assemble l'index entier avec les valeurs binaires conditionnelles
* et retourne la valeur de sortie trouvée dans la table de verites
*/
return(&sorties[(dfi ? DFI : 0)
& (dft ? DFT : 0)
& (dds ? DDS : 0)
& (dfs ? DFS : 0)]);
}
Cependant j'ignore si implémenter un index en assemblant des valeurs
binaires est plus ou moins coûteux en temps de réponse qu'implémenter
une suite de comparaisons algorithmiques.
De plus, l'indexation d'une table de vérité resterait-elle plus
avantageuse lorsque la complexité des conditions augmente en
considération d'un environnement moderne (cache L1-L2, pipelining,
prédictions des branchements, RAM significativement plus lente que le
CPU...).
L'approche tabulaire est séduisante de simplicité, mais as-t'elle un
sens ou est-ce une optimisation prématurée ?
Toutefois, sur cette table on lit directement l'algorithme suivant :
if (DDS == DFS)
{
if (DFI == 0 && DFT == 0)
{
return EN;
}
else
{
return OK;
}
}
else if (DDS == 0)
{
return ND;
}
else
{
if (DFI == 0 && DFT == 0)
{
return SU;
}
else
{
return AN;
}
}
Je ne sais pas trop si ça répond à ta question, mais je ne pense pas
qu'on puisse faire plus simple.