[Tutor] request for sugestions on fragement of code for generating truth-tables

Orri Ganel singingxduck at gmail.com
Sat Apr 1 23:04:29 CEST 2006


Brian van den Broek wrote:

>Hi all,
>
>I've been too busy with life to do much Python of late. So, I am a bit
>rusty. :-(
>
>I've got some code that does what it needs to but I think I might be 
>overlooking a much smoother way to get what I need.
>
>The code takes a list of strings and returns a list of dictionaries, 
>where each dictionary uses the strings from the list as keys and 
>booleans as values. The dictionary list contains a dictionary 
>exhibiting each possible combination of booleans over the keys, where 
>these combinations are listed in a systematic way.
>
>This code works:
>
>def tva_dict_maker(atoms):
>
>     tvas = []
>     val = False
>
>     for k in range(2**len(atoms)):
>         tvas.append(dict())
>
>     for i in range(len(atoms)):
>         key = atoms[i]
>
>         for j in range(2**len(atoms)):
>             if j % ( len(tvas) / 2.0 ** (i+1) ) == 0:
>                 val = not val
>             tvas[j][key]=val
>
>     return tvas
>
>The output I desire is easier to see with a bit of processing (to 
>impose order on the dicts). So,
>
>def display_tvas(tvas):
>     for i in tvas:
>	for j in sorted(i):
>		print "%s:%s\t" %(j, i[j]),
>	print
>
>Then, the output is like so:
>
> >>> atoms = ["a","b","c"]
> >>> tvas = tva_dict_maker(atoms)
> >>> display_tvas(tvas)
>a:True	b:True	c:True	
>a:True	b:True	c:False	
>a:True	b:False	c:True	
>a:True	b:False	c:False	
>a:False	b:True	c:True	
>a:False	b:True	c:False	
>a:False	b:False	c:True	
>a:False	b:False	c:False	
> >>>
>
>As desired :-)
>
>But, I can't shake the feeling I'm doing this in a harder than 
>necessary way :-|
>
>[This is in the context of writing a program to generate truth-tables 
>for sentential logic, so that I can easily create answered exercises 
>for a critical thinking course I've been teaching. (As it is for a 
>Philosophy class, the truth-values are listed in the opposite order 
>than in a CompSci context.)]
>
>Any suggestions would be welcome.
>
>Best to all,
>
>Brian vdB
>_______________________________________________
>Tutor maillist  -  Tutor at python.org
>http://mail.python.org/mailman/listinfo/tutor
>
>  
>
What this shouts immediately to me, at least, is binary numbers and 
bool().  Just use your favorite binary conversion recipe, and count down 
from int(len(atoms)*"1",2), converting as you go.  And then you take the 
boolean value of each digit of the binary number.  If you need help, let 
me know as I've completed a working model.

HTH,
Orri

-- 
Email: singingxduck AT gmail DOT com
AIM: singingxduck
Programming Python for the fun of it.



More information about the Tutor mailing list