DSPython  00.03.03 — 25 juin 2012
 Tout Classes Espaces de nommage Fichiers Fonctions Variables Pages
bool.py
Aller à la documentation de ce fichier.
1 #!/usr/bin/env python
2 # -*- coding: latin-1 -*-
3 ##\package DSPython.bool Booléens : les 16 connecteurs binaires
4 #
5 # Cf. \htmlonly <a href="http://www.opimedia.be/logiques/" target="_blank">
6 # <tt>http://www.opimedia.be/logiques/</tt></a>\endhtmlonly
7 #\htmlonly
8 #<table border="1" cellspacing="0" summary="connecteurs binaires">
9 #<tr align="center" style="color:gray">
10 #<td colspan="2" align="left">&ldquo;connecteur négatif&rdquo;</td>
11 #<td style="background:gray"></td>
12 #<td class="math"><span style="margin-right:-.8ex">&nbsp;/</span>1</td>
13 #<td class="math"><span
14 # style="margin-left:-.5ex;margin-right:-.5ex">&nbsp;&nbsp;/</span>|&nbsp;</td>
15 #<td class="math"><span style="margin-right:-1.2ex">&nbsp;/</span>&rarr;</td><td>&nbsp;</td>
16 #<td class="math"><span style="margin-right:-1.2ex">&nbsp;/</span>&larr;</td><td>&nbsp;</td>
17 #<td class="math"><span style="margin-right:-1.2ex">&nbsp;/</span>&harr;</td>
18 #<td class="math"><span style="margin-right:-.75ex">&nbsp;/</span>&darr;&nbsp;</td>
19 #<td style="background:gray"></td>
20 #<td class="math"><span style="margin-left:-.5ex;margin-right:-1ex">&nbsp;&nbsp;/</span>&or;</td>
21 #<td class="math"><span style="margin-right:-1.25ex">&nbsp;&nbsp;/</span>&oplus;</td>
22 #<td class="math"><span style="margin-right:-.75ex">&nbsp;/</span>b</td><td>&nbsp;</td>
23 #<td class="math"><span style="margin-right:-.75ex">&nbsp;/</span>a</td><td>&nbsp;</td>
24 #<td class="math"><span style="margin-right:-1.25ex">&nbsp;&nbsp;/</span>&and;</td>
25 #<td class="math"><span style="margin-right:-.8ex">&nbsp;/</span>0</td></tr>
26 #
27 #<tr style="background:gray"><td></td><td></td><td></td><td></td><td></td><td></td><td></td>
28 #<td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td>
29 #<td></td><td></td><td></td></tr>
30 #<tr class="math" align="center"><th>a</th><th>b</th><th width="0" style="background:gray"></th>
31 #<th width="20">0</th><th width="20">&and;</th><th width="20">&nbsp;</th><th width="20">a</th>
32 #<th width="20">&nbsp;</th><th width="20">b</th><th width="20">&oplus;</th>
33 #<th width="20">&or;</th><th style="background:gray"></th><th width="20">&darr;</th>
34 #<th width="20">&harr;</th><th width="20">&nbsp;</th><th width="20">&larr;</th>
35 #<th width="20">&nbsp;</th><th width="20">&rarr;</th><th width="20">|</th><th width="20">1</th></tr>
36 #<tr style="background:gray"><td></td><td></td><td></td><td></td><td></td><td></td><td></td>
37 #<td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td>
38 #<td></td><td></td><td></td></tr>
39 #
40 #<tr class="math" align="center"><th>0</th><th>0</th><td style="background:gray"></td><td>0</td>
41 #<td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td>
42 #<td style="background:gray"></td><td>1</td><td>1</td><td>1</td><td>1</td><td>1</td><td>1</td>
43 #<td>1</td><td>1</td></tr>
44 #<tr class="math" align="center"><th>0</th><th>1</th><td style="background:gray"></td><td>0</td>
45 #<td>0</td><td>0</td><td>0</td><td>1</td><td>1</td><td>1</td><td>1</td>
46 #<td style="background:gray"></td><td>0</td><td>0</td><td>0</td><td>0</td><td>1</td><td>1</td>
47 #<td>1</td><td>1</td></tr>
48 #<tr class="math" align="center"><th>1</th><th>0</th><td style="background:gray"></td><td>0</td>
49 #<td>0</td><td>1</td><td>1</td><td>0</td><td>0</td><td>1</td><td>1</td>
50 #<td style="background:gray"></td><td>0</td><td>0</td><td>1</td><td>1</td><td>0</td><td>0</td>
51 #<td>1</td><td>1</td></tr>
52 #<tr class="math" align="center"><th>1</th><th>1</th><td style="background:gray"></td><td>0</td>
53 #<td>1</td><td>0</td><td>1</td><td>0</td><td>1</td><td>0</td><td>1</td>
54 #<td style="background:gray"></td><td>0</td><td>1</td><td>0</td><td>1</td><td>0</td><td>1</td>
55 #<td>0</td><td>1</td></tr>
56 #<tr style="background:gray"><td></td><td></td><td></td><td></td><td></td><td></td><td></td>
57 #<td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td>
58 #<td></td><td></td><td></td></tr>
59 #</table>
60 #\endhtmlonly
61 
62 ##\file
63 # Booléens : les 16 connecteurs binaires
64 #
65 # Cf. \htmlonly <a href="http://www.opimedia.be/logiques/" target="_blank">
66 # <tt>http://www.opimedia.be/logiques/</tt></a>\endhtmlonly
67 
68 # (c) Olivier Pirson --- DragonSoft
69 # http://www.opimedia.be/DS/
70 # Débuté le 3 juin 2007
71 ####################################
72 from __future__ import print_function
73 
74 ## Date du dernier changement pour ce module
75 VERSION = 'bool --- 2010 April 12'
76 
77 
78 
79 # ###########
80 # Fonctions #
81 #############
82 ## Renvoie a (premier élément)
83 def bin_a(a, b):
84  """Renvoie a
85  (connecteur binaire : premier élément)
86 
87  Pre: a: valeur booléenne
88  b: valeur booléenne
89 
90  Result: bool
91 
92  O() = 1"""
93  return bool(a)
94 
95 
96 ## Renvoie \htmlonly a &and; b\endhtmlonly (conjonction)
97 def bin_and(a, b):
98  """Renvoie a et b
99  (connecteur binaire : conjonction)
100  !!! Contrairement à l'opérateur Python and, les deux arguments sont toujours évalués
101 
102  Pre: a: valeur booléenne
103  b: valeur booléenne
104 
105  Result: bool
106 
107  O() = 1"""
108  return bool(a) and bool(b)
109 
110 
111 ## Renvoie b (second élément)
112 def bin_b(a, b):
113  """Renvoie b
114  (connecteur binaire : second élement)
115 
116  Pre: a: valeur booléenne
117  b: valeur booléenne
118 
119  Result: bool
120 
121  O() = 1"""
122  return bool(b)
123 
124 
125 ## Renvoie \htmlonly a &harr; b\endhtmlonly (double implication, égalité booléenne)
126 def bin_eq(a, b):
127  """Renvoie a équivalent à b
128  (connecteur binaire : double implication, égalité booléenne)
129 
130  Pre: a: valeur booléenne
131  b: valeur booléenne
132 
133  Result: bool
134 
135  O() = 1"""
136  return bool(a) == bool(b)
137 
138 
139 ## Renvoie False
140 def bin_false(a, b):
141  """Renvoie False
142  (connecteur binaire : constante faux)
143 
144  Pre: a: valeur booléenne
145  b: valeur booléenne
146 
147  Result: False
148 
149  O() = 1"""
150  return False
151 
152 
153 ## Renvoie \htmlonly a &rarr; b\endhtmlonly (implication)
154 def bin_imp(a, b):
155  """Renvoie a implique b
156  (connecteur binaire : implication)
157 
158  Pre: a: valeur booléenne
159  b: valeur booléenne
160 
161  Result: bool
162 
163  O() = 1"""
164  return bool(b) or not bool(a)
165 
166 
167 ## Renvoie not a (négation du premier élément)
168 def bin_na(a, b):
169  """Renvoie not a
170  (connecteur binaire : négation du premier élément)
171 
172  Pre: a: valeur booléenne
173  b: valeur booléenne
174 
175  Result: bool
176 
177  O() = 1"""
178  return not bool(a)
179 
180 
181 ## Renvoie a | b (incompatibilité, barre de Sheffer, négation du et)
182 def bin_nand(a, b):
183  """Renvoie a est incompatible avec b
184  (connecteur binaire : incompatibilité, barre de Sheffer, négation du et)
185 
186  Pre: a: valeur booléenne
187  b: valeur booléenne
188 
189  Result: bool
190 
191  O() = 1"""
192  return not(bool(a) and bool(b))
193 
194 
195 ## Renvoie not b (négation du second élément)
196 def bin_nb(a, b):
197  """Renvoie not b
198  (connecteur binaire : négation du second élément)
199 
200  Pre: a: valeur booléenne
201  b: valeur booléenne
202 
203  Result: bool
204 
205  O() = 1"""
206  return not bool(b)
207 
208 
209 ## Renvoie \htmlonly not(a &rarr; b)\endhtmlonly (négation de l'implication)
210 def bin_nimp(a, b):
211  """Renvoie not(a implique b)
212  (connecteur binaire : négation de l'implication)
213 
214  Pre: a: valeur booléenne
215  b: valeur booléenne
216 
217  Result: bool
218 
219  O() = 1"""
220  return bool(a) and (not bool(b))
221 
222 
223 ##\brief Renvoie \htmlonly a &darr; b\endhtmlonly
224 # (négation conjointe, barre de Sheffer duale, négation du ou)
225 def bin_nor(a, b):
226  """Renvoie a négation conjointe b
227  (connecteur binaire : négation conjointe, barre de Sheffer duale, négation du ou)
228 
229  Pre: a: valeur booléenne
230  b: valeur booléenne
231 
232  Result: bool
233 
234  O() = 1"""
235  return not(bool(a) or bool(b))
236 
237 
238 ## Renvoie \htmlonly not(a &larr; b)\endhtmlonly (négation de l'implication réciproque)
239 def bin_nrec(a, b):
240  """Renvoie not(b implique a)
241  (connecteur binaire : négation de l'implication réciproque)
242 
243  Pre: a: valeur booléenne
244  b: valeur booléenne
245 
246  Result: bool
247 
248  O() = 1"""
249  return bool(b) and not bool(a)
250 
251 
252 ## Renvoie \htmlonly a &or; b\endhtmlonly (disjonction inclusive)
253 def bin_or(a, b):
254  """Renvoie a ou b
255  (connecteur binaire : disjonction inclusive)
256  !!! Contrairement à l'opérateur Python or, les deux arguments sont toujours évalués
257 
258  Pre: a: valeur booléenne
259  b: valeur booléenne
260 
261  Result: bool
262 
263  O() = 1"""
264  return bool(a) or bool(b)
265 
266 
267 ## Renvoie \htmlonly a &larr; b\endhtmlonly (implication réciproque)
268 def bin_rec(a, b):
269  """Renvoie b implique a
270  (connecteur binaire : implication réciproque)
271 
272  Pre: a: valeur booléenne
273  b: valeur booléenne
274 
275  Result: bool
276 
277  O() = 1"""
278  return bool(a) or not bool(b)
279 
280 
281 ## Renvoie True
282 def bin_true(a, b):
283  """Renvoie True
284  (connecteur binaire : constante vraie)
285 
286  Pre: a: valeur booléenne
287  b: valeur booléenne
288 
289  Result: True
290 
291  O() = 1"""
292  return True
293 
294 
295 ## Renvoie \htmlonly a &oplus; b\endhtmlonly (disjonction exclusive)
296 def bin_xor(a, b):
297  """Renvoie a xou b
298  (connecteur binaire : disjonction exclusive)
299 
300  Pre: a: valeur booléenne
301  b: valeur booléenne
302 
303  Result: bool
304 
305  O() = 1"""
306  a = bool(a)
307  b = bool(b)
308  return (a or b) and not (a and b)
309 
310 
311 ## Renvoie a si t, b sinon (si alors sinon)
312 def ter_if(t, a, b):
313  """Renvoie a si t, b sinon
314  (connecteur ternaire : si alors sinon)
315 
316  Pre: t: valeur booléenne
317  a: valeur booléenne
318  b: valeur booléenne
319 
320  Result: bool
321 
322  O() = 1"""
323  return (bool(a) if bool(t)
324  else bool(b))
325 
326 
327 
328 # ######\cond MAINTEST
329 # Main #
330 ########
331 if __name__ == '__main__':
332  def main_test():
333  """Test du module"""
334  import sys
335 
336  import DSPython.debug as debug
337 
338  debug.test_begin(VERSION, __debug__)
339 
340 
341  print('bin_a()...', end=''); sys.stdout.flush()
342  assert bin_a(False, False) == False
343  assert bin_a(False, True) == False
344  assert bin_a(True, False) == True
345  assert bin_a(True, True) == True
346  print('ok'); sys.stdout.flush()
347 
348 
349  print('bin_and()...', end=''); sys.stdout.flush()
350  assert bin_and(False, False) == False
351  assert bin_and(False, True) == False
352  assert bin_and(True, False) == False
353  assert bin_and(True, True) == True
354  print('ok'); sys.stdout.flush()
355 
356 
357  print('bin_b()...', end=''); sys.stdout.flush()
358  assert bin_b(False, False) == False
359  assert bin_b(False, True) == True
360  assert bin_b(True, False) == False
361  assert bin_b(True, True) == True
362  print('ok'); sys.stdout.flush()
363 
364 
365  print('bin_eq()...', end=''); sys.stdout.flush()
366  assert bin_eq(False, False) == True
367  assert bin_eq(False, True) == False
368  assert bin_eq(True, False) == False
369  assert bin_eq(True, True) == True
370  print('ok'); sys.stdout.flush()
371 
372 
373  print('bin_false()...', end=''); sys.stdout.flush()
374  assert bin_false(False, False) == False
375  assert bin_false(False, True) == False
376  assert bin_false(True, False) == False
377  assert bin_false(True, True) == False
378  print('ok'); sys.stdout.flush()
379 
380 
381  print('bin_imp()...', end=''); sys.stdout.flush()
382  assert bin_imp(False, False) == True
383  assert bin_imp(False, True) == True
384  assert bin_imp(True, False) == False
385  assert bin_imp(True, True) == True
386  print('ok'); sys.stdout.flush()
387 
388 
389  print('bin_na()...', end=''); sys.stdout.flush()
390  assert bin_na(False, False) == True
391  assert bin_na(False, True) == True
392  assert bin_na(True, False) == False
393  assert bin_na(True, True) == False
394  print('ok'); sys.stdout.flush()
395 
396 
397  print('bin_nand()...', end=''); sys.stdout.flush()
398  assert bin_nand(False, False) == True
399  assert bin_nand(False, True) == True
400  assert bin_nand(True, False) == True
401  assert bin_nand(True, True) == False
402  print('ok'); sys.stdout.flush()
403 
404 
405  print('bin_nb()...', end=''); sys.stdout.flush()
406  assert bin_nb(False, False) == True
407  assert bin_nb(False, True) == False
408  assert bin_nb(True, False) == True
409  assert bin_nb(True, True) == False
410  print('ok'); sys.stdout.flush()
411 
412 
413  print('bin_nimp()...', end=''); sys.stdout.flush()
414  assert bin_nimp(False, False) == False
415  assert bin_nimp(False, True) == False
416  assert bin_nimp(True, False) == True
417  assert bin_nimp(True, True) == False
418  print('ok'); sys.stdout.flush()
419 
420 
421  print('bin_nor()...', end=''); sys.stdout.flush()
422  assert bin_nor(False, False) == True
423  assert bin_nor(False, True) == False
424  assert bin_nor(True, False) == False
425  assert bin_nor(True, True) == False
426  print('ok'); sys.stdout.flush()
427 
428 
429  print('bin_nrec()...', end=''); sys.stdout.flush()
430  assert bin_nrec(False, False) == False
431  assert bin_nrec(False, True) == True
432  assert bin_nrec(True, False) == False
433  assert bin_nrec(True, True) == False
434  print('ok'); sys.stdout.flush()
435 
436 
437  print('bin_or()...', end=''); sys.stdout.flush()
438  assert bin_or(False, False) == False
439  assert bin_or(False, True) == True
440  assert bin_or(True, False) == True
441  assert bin_or(True, True) == True
442  print('ok'); sys.stdout.flush()
443 
444 
445  print('bin_rec()...', end=''); sys.stdout.flush()
446  assert bin_rec(False, False) == True
447  assert bin_rec(False, True) == False
448  assert bin_rec(True, False) == True
449  assert bin_rec(True, True) == True
450  print('ok'); sys.stdout.flush()
451 
452 
453  print('bin_true()...', end=''); sys.stdout.flush()
454  assert bin_true(False, False) == True
455  assert bin_true(False, True) == True
456  assert bin_true(True, False) == True
457  assert bin_true(True, True) == True
458  print('ok'); sys.stdout.flush()
459 
460 
461  print('bin_xor()...', end=''); sys.stdout.flush()
462  assert bin_xor(False, False) == False
463  assert bin_xor(False, True) == True
464  assert bin_xor(True, False) == True
465  assert bin_xor(True, True) == False
466  print('ok'); sys.stdout.flush()
467 
468 
469  print()
470  print('ter_if()...', end=''); sys.stdout.flush()
471  assert ter_if(False, False, False) == False
472  assert ter_if(False, False, True) == True
473  assert ter_if(False, True, False) == False
474  assert ter_if(False, True, True) == True
475 
476  assert ter_if(True, False, False) == False
477  assert ter_if(True, False, True) == False
478  assert ter_if(True, True, False) == True
479  assert ter_if(True, True, True) == True
480  print('ok'); sys.stdout.flush()
481  debug.test_end()
482 
483  main_test()
484 ##\endcond MAINTEST