Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:对列表中的元素应用分布规律_Python_Python 2.7 - Fatal编程技术网

Python:对列表中的元素应用分布规律

Python:对列表中的元素应用分布规律,python,python-2.7,Python,Python 2.7,我想在python2.7中完成以下工作。它适用于2个子元素的情况,但我可以有多个子元素 NOT = "not" OR = "or" AND = "and" def convertMain(prop) : if isinstance(prop, str) : answer = prop else : op = prop[0] #tree1 = convertIntoCNF(prop[1]) #tree2 =

我想在python2.7中完成以下工作。它适用于2个子元素的情况,但我可以有多个子元素

NOT = "not"
OR = "or"
AND  = "and"

def convertMain(prop) :

    if isinstance(prop, str) : 
        answer = prop
    else :
        op = prop[0]
        #tree1 =  convertIntoCNF(prop[1])
        #tree2 =  convertIntoCNF(prop[2])
        """{ assert: tree1 and tree2  are in  cnf }"""
        if op == AND :            
            answer = [AND] + [convertIntoCNF(item) for item in prop[1:]]
        else : # op == OR
            if (len(prop) == 3) :
                tree1 =  convertIntoCNF(prop[1])
                tree2 =  convertIntoCNF(prop[2])

                answer = distOr2(tree1, tree2)

    return answer

def distOr2(p1,p2):

    if isinstance(p1, list) and p1[0] == AND :
        #{ assert:  p1 = P11 & P12 }
        answer = [AND, distOr2(p1[1],p2), distOr2(p1[2],p2)]
    elif  isinstance(p2, list) and p2[0] == AND :
        #{ assert:  p2 = P21 & P22 }
        answer = [AND, distOr2(p1,p2[1]), distOr2(p1,p2[2])]
    else :
        #{ assert: since  p1 and p2 are both in cnf, then both are disjunctive clauses, which can be appended }
        answer = [OR, p1, p2]
    return answer
上述代码适用于以下情况:

 Input  : ['and', ['or', ['and', '-P', 'Q'], 'R'], ['or', '-P', '-R']]
 Output : ['and', ['and', ['or', '-P', 'R'], ['or', 'Q', 'R']], ['or', '-P', '-R']]
说明:

 Input is expression ((-P V Q) V R) ^ (-P V -R))
 Output is expression  ((-P V R) ^ (Q V R)) ^ (-P V -R)
我想对任意数量的子元素进行此操作,如下面的示例中,“S”是输入中的第三个元素,因此['or','S','R']应该添加到输出中:

 Input  : ['and', ['or', ['and', '-P', 'Q', 'S'], 'R'], ['or', '-P', '-R']]
 Output : ['and', ['and', ['or', '-P', 'R'], ['or', 'Q', 'R'], ['or', 'S', 'R']], ['or', '-P', '-R']]

谢谢。

您可以创建一个方法,该方法可以递归地将具有两个子元素以上的任何内容转换为每个列表都有两个子元素的形式(即每个逻辑连接词只有两个参数)。例如:

def makeBinary(prop):
    if isinstance(prop, str):
        return prop
    elif len(prop) == 3:
        return [prop[0], makeBinary(prop[1]), makeBinary(prop[2])]
    else:
        return [prop[0], makeBinary(prop[1]), makeBinary([prop[0]] + prop[2:])]

然后,您可以在任何命题上调用它,然后再通过您已有的代码运行它,并且您的代码可以安全地假设任何连接词都不会有超过两个参数。

听起来是个好主意。你能编辑我的代码并告诉我在哪里以及如何调用makeBinary函数吗?感谢您可以调用
prop=makeBinary(prop)
,这是您在
convertMain
中所做的第一件事。