[HAOI2004模拟]逻辑表达式

成绩 0 开启时间 2013年02月21日 星期四 23:02
折扣 0.8 折扣时间 2013年02月28日 星期四 23:02
允许迟交 关闭时间 2013年02月28日 星期四 23:02
输入文件 expressa.in 输出文件 expressa.out

【问题描述】
由英文字母和符号~、 *、+、()组成逻辑表达式,英文字母表示变量,变量有两种可能的取值,False或True;~、*、+、括号()可改变表达式的运算次序,且可以嵌套。

逻辑 “非”运算的公式如下表:

A

~ A

TRUE

FALSE

FALSE

TRUE

逻辑 “与”和逻辑“或”的运算公式如下表:

A

B

A*B

A+B

FALSE

FALSE

FLASE

FLASE

FALSE

TRUE

FLASE

TRUE

TRUE

FALSE

FALSE

TRUE

TRUE

TRUE

TRUE

TRUE

两个逻辑表达式等价,当且仅当两个公式中相同名字的变量取任何一种值时两个公式的值都相同。如:

A*(B+C) 与 A*B+A*C 等价
A*(~A+B) 与 A*B 等价
(~A+A)*B+C 与 B+C 等价
A*B+A*~B 与 A 等价
而:

A+B 与 A*B 不等价
A*B+~C 与 A*E+~F 不等价

现要求你编程解决下列问题:

任务 1 :读取一个逻辑表达式,判断这个表达式的合法性;

【输入格式1】
    输入文件只有一行,一个字符串s,s的长度不超过255。

【输出格式1】
   输出文件只有一个单词,yes或no。 表达式合法时输出yes,不合法时输出no。
【输入输出样例1】 
输入:
expressa.in
(A+B)*(A-B)

输出:
expressa.out
no

(注:逻辑运算中没有"-"运算)

任务2:

将读入的表达式化简,化简的表达式为
a1*a2*…*aN+b1**b2*…*bM+…+x1*x2*…*xL
其中 ai、bj、…xk(i=1,2,…n; j=1,2,…m; k=1,2,…L)表示一个变量或一个变量的逻辑非;

【输入输出样例2】 
输入:
expressb.in
(A+B)*C

输出:
expressb.out
A*C+B*C