Hi!

At Mon, 22 May 2006 18:29:21 +0900, pisteur / hotmail.de wrote:

> Could someone give me an example for the transformation from a logical 
> expression to DNF or KNF?

A boolean expression can allways be transformed into a table of
values. Say the expression is

f(x,y,z) = (x + y) * z

This results in the following table:

i | x y z | f
--+-------+---
0 | 0 0 0 | 0
1 | 0 0 1 | 0
2 | 0 1 0 | 0
3 | 0 1 1 | 1
4 | 1 0 0 | 0
5 | 1 0 1 | 1
6 | 1 1 0 | 0
7 | 1 1 1 | 1

For DNF collect all terms that result in f(x,y,z) = 1 (allow me to use
uppercase for negation):

f(x,y,z) = Xyz + xYz + xyz = m3 + m5 + m7

For KNF you exploit the fact that NOT(NOT(f)) is the same as f by
first expressing NOT(f) in DNF, negating the whole term and then using
NOT(x+y) = X * Y as well as NOT(x*y) = X + Y:

f(x,y,z) = NOT(XYZ + XYz + XyZ + xYZ + xyZ)
         = NOT(XYZ) * NOT(XYz) * NOT(XyZ) * NOT(xYZ) * NOT(xyZ)
         = (x+y+z) * (x+y+Z) * (x+Y+z) * (X+y+z) * (X+Y+z)
         = M0 * M1 * M2 * M4 * M6


Wait a moment. I did not tell you to actually go through that
process. The real solution of the task is *way* simpler.

For DNF sum up all minterms with indices that have a 1 in the result
column, that is:

f(x,y,z) = m3 + m5 + m7

For KNF multiply all Maxterms with indices that have a 0 in the result
column:

f(x,y,z) = M0 + M1 + M2 + M4 + M6

In a program the above pocess may look like this:

dnf = Array.new
knf = Array.new

(0..7).each do |i|
  if fun(i) then
    dnf.push i
  else
    knf.push i
  end
end

p dnf.sort
p knf.sort

where "fun" is defined so that for a number i with least significan
boolean digits xyz and

a = (x == 1 ? true : false)
b = (y == 1 ? true : false)
c = (z == 1 ? true : false)

fun(i) = f(a,b,c)

HTH,

Josef 'Jupp' Schugt
-- 
500'8"N/7ー9'58"E = 50ー40.1333'N/7ー9.9667'E = 50.668889ー/7.166111ー
Link of the day:
URL: http://www.intuitor.com/moviephysics/
IS:  When Worlds Collide: Physics vs. Movies