分页: 1 / 1

为了检查我的命题逻辑作业....

发表于 : 2008-10-01 11:07
BigSnake.NET
a.py

代码: 全选

import string
atom_alphabet = list(string.ascii_lowercase)
operator_alphabet = ['<->','!','&&','||','->','(',')']
alphabet = operator_alphabet + atom_alphabet

def explaintion_generator(atom_list):
    if len(atom_list) == 0:
        yield {}
    else:
        for i in explaintion_generator(atom_list[:-1]):
            i[atom_list[-1]] = False
            yield i
            i[atom_list[-1]] = True
            yield i
    def __str__(self):
        pass

class exp:
    def evaluate(self,explaintion):
        pass
    def print_value_table(self,atom_parentheseslist):
        import sys
        sys.stdout.write('N')
        for i in atom_list:
            sys.stdout.write('\t' + i)
        sys.stdout.write('\t' + str(self) + '\n')
        n = 0
        for i in explaintion_generator(atom_list):
            sys.stdout.write(str(n))
            n += 1 
            for j in atom_list:
                sys.stdout.write('\t' + str(i[j]))
            sys.stdout.write('\t' + str(self.evaluate(i)) + '\n')

class orexp(list,exp):
    def __str__(self):
        return '(' + ' || '.join([str(i) for i in self]) + ')'
    def evaluate(self,explaintion):
        res = False
        for i in self:
            res = res or i.evaluate(explaintion)
            if res:
                return res
        return res

class andexp(list,exp):
    def __str__(self):
        return '(' + ' && '.join([str(i) for i in self]) + ')'
    def evaluate(self,explaintion):
        res = True
        for i in self:
            res = res and i.evaluate(explaintion)
            if not res:
                return res
        return res

class eqexp(exp):
    def __init__ (self,l,r):
        self.l = l
        self.r = r
    def __str__(self):
        return '(' + str(self.l) + ' <-> ' + str(self.r) + ')'
    def evaluate(self,explaintion):
        l = self.l.evaluate(explaintion)
        r = self.r.evaluate(explaintion)
        return l == r

class impexp(exp):
    def __init__ (self,l,r):
        self.l = l
        self.r = r
    def __str__(self):
        return '(' + str(self.l) + ' -> ' + str(self.r) + ')'
    def evaluate(self,explaintion):
        l = self.l.evaluate(explaintion)
        r = self.r.evaluate(explaintion)
        return ( not l ) or r

class notexp(exp):
    def __init__ (self,e):
        self.e = e
    def __str__(self):
        return '!' + str(self.e) 
    def evaluate(self,explaintion):
        return not self.e.evaluate(explaintion)

class atomexp(exp,str):
    def __str__ (self):
        return str.__str__(self)
    def evaluate(self,explaintion):
        return explaintion[str(self)]

class holding_iter(object):
    def __init__ (self,s):
        self.i = iter(s)
        self.now = ''
    def next (self):
        self.now = ''
        while not (self.now in alphabet):
            t = self.i.next()
            if not t in string.whitespace:
                self.now += t
        return self.now

def parseexp0(i): #or
    e = parseexp1(i)
    if i.now == '||':
        ore = orexp()
        ore.append(e)
        while i.now == '||':
            i.next()
            e = parseexp1(i)
            ore.append(e)
        return ore
    else :
        return e

def parseexp1(i): #and
    e = parseexp2(i)
    if i.now == '&&':
        ande = andexp()
        ande.append(e)
        while i.now == '&&':
            i.next()
            e = parseexp2(i)
            ande.append(e)
        return ande
    else :
        return e

def parseexp2(i): #imply
    e = parseexp3(i)
    if i.now == '->':
        i.next()
        e2 = parseexp3(i)
        return impexp(e,e2)
    else:
        return e

def parseexp3(i): #equal
    e = parseexp4(i)
    if i.now == '<->':
        i.next()
        e2 = parseexp4(i)
        return eqexp(e,e2)
    else:
        return e

def parseexp4(i): #not
    if i.now == '!':
        i.next()
        return notexp(parseexp4(i))
    else:
        return parseexp5(i)

def parseexp5(i): #atom
    if i.now in atom_alphabet:
        e = atomexp(i.now)
        try:
            i.next()
        except StopIteration:
            return e
        return e
    else:
        return parseexp6(i)

def parseexp6(i): #parentheses
    if i.now == '(':
        i.next()
        e = parseexp0(i)
        if i.now == ')':
            try:
                i.next()
            except StopIteration:
                return e
            return e
        else:
            raise Exception('error while parsing expression string.')
    else:
            raise Exception('error while parsing expression string.')

if __name__ == '__main__':
#s = '(p->q) && (s||t) && ((q&&!r) || (!q&&r)) && (r<->s) && (t -> (p&&q))'
    import sys
    s = sys.argv[1]
    atom_list = []
    i = holding_iter(s)
    while True:
        try:
            j = i.next()
        except StopIteration:
            break
        if j in atom_alphabet and ( not j in atom_list ):
            atom_list.append(j)
    atom_list.sort()

    i = holding_iter(s)
    i.next()
    a = parseexp0(i)
    # print a
    a.print_value_table(atom_list)

代码: 全选

$ python a.py '(p->q) && (s||t) && ((q&&!r) || (!q&&r)) && (r<->s) && (t -> (p&&q))'
N       p       q       r       s       t       ((p -> q) && (s || t) && ((q && !r) || (!q && r)) && (r <-> s) && (t -> (p && q)))
0       False   False   False   False   False   False
1       False   False   False   False   True    False
2       False   False   False   True    False   False
3       False   False   False   True    True    False
4       False   False   True    False   False   False
5       False   False   True    False   True    False
6       False   False   True    True    False   True
7       False   False   True    True    True    False
8       False   True    False   False   False   False
9       False   True    False   False   True    False
10      False   True    False   True    False   False
11      False   True    False   True    True    False
12      False   True    True    False   False   False
13      False   True    True    False   True    False
14      False   True    True    True    False   False
15      False   True    True    True    True    False
16      True    False   False   False   False   False
17      True    False   False   False   True    False
18      True    False   False   True    False   False
19      True    False   False   True    True    False
20      True    False   True    False   False   False
21      True    False   True    False   True    False
22      True    False   True    True    False   False
23      True    False   True    True    True    False
24      True    True    False   False   False   False
25      True    True    False   False   True    True
26      True    True    False   True    False   False
27      True    True    False   True    True    False
28      True    True    True    False   False   False
29      True    True    True    False   True    False
30      True    True    True    True    False   False
31      True    True    True    True    True    False

Re: 为了检查我的命题逻辑作业....

发表于 : 2008-10-26 23:28
异域追梦者
球猫大一就学离散啦

Re: 为了检查我的命题逻辑作业....

发表于 : 2008-10-27 6:24
anticlockwise
赞球猫~~把错~~你领悟了大学里边计算机学习的精髓,从课程作业里找程序+项目~~