示例#1
0
def skolemize(clause: Clause) -> Clause:
    # Find all variables in clause
    vars = clause.get_variables()

    # Map from X,Y,Z,... -> sk0,sk1,sk2,...
    subst = {
        vars[i]: Constant(f"sk{i}", c_type("thing"))
        for i in range(len(vars))
    }

    # Apply this substitution to create new clause without quantifiers
    return clause.substitute(subst), subst
def _instantiate_var_clause(clause: Clause, constant: Constant):
    """
    Returns all clauses generated by substituting a `Variable` in `clause` with `constant`.
    """
    if isinstance(clause, Body):
        suitable_vars = clause.get_variables()
    else:
        suitable_vars = clause.get_body_variables()

    candidates = []
    for var in suitable_vars:
        candidates.append(clause.substitute({var:constant}))
    # if len(candidates) > 0:
    #     print("Type of each is {}", type(candidates[0]))
    return list(set(candidates))
示例#3
0
    def encode(self, clause: Clause):
        encodingClause = np.zeros(1850)
        vars = []
        set = {}
        index = 0
        for lit in [clause.get_head(), *clause.get_literals()]:
            var = ''
            for variable in lit.get_variables():
                var += variable.get_name()
            if var in set:
                index = set[var]
                vars[index][1].append(lit)
            else:
                set[var] = index
                index += 1
                list = [lit]
                if len(var) == 1:
                    value = 100000 * (ord(var) - 64) + 3500 * (
                        ord(var) - 64) + 130 * (ord(var) - 64)
                else:
                    if len(var) == 2:
                        if ord(var[0]) <= ord(var[-1]):
                            value = 100000 * (ord(var[0]) - 64) + 3500 * (
                                ord(var[0]) - 64) + 130 * (ord(var[-1]) - 64)
                        else:
                            value = 100000 * (ord(var[0]) - 64) + 3500 * (ord(
                                var[0]) - 64) + 130 * (ord(var[-1]) - 64) + 1
                    else:
                        if ord(var[0]) <= ord(var[1]) <= ord(var[2]):
                            value = 100000 * (ord(var[0]) - 64) + 3500 * (
                                ord(var[1]) - 64) + 130 * (ord(var[2]) - 64)
                        else:
                            if ord(var[0]) <= ord(var[2]) <= ord(var[1]):
                                value = 100000 * (ord(var[0]) - 64) + 3500 * (
                                    ord(var[2]) - 64) + 130 * (ord(var[1]) -
                                                               64) + 1
                            else:
                                if ord(var[1]) <= ord(var[0]) <= ord(var[2]):
                                    value = 100000 * (
                                        ord(var[1]) - 64) + 3500 * (
                                            ord(var[0]) -
                                            64) + 130 * (ord(var[2]) - 64) + 2
                                else:
                                    if ord(var[1]) <= ord(var[0]) <= ord(
                                            var[2]):
                                        value = 100000 * (
                                            ord(var[1]) - 64) + 3500 * (
                                                ord(var[0]) - 64) + 130 * (
                                                    ord(var[2]) - 64) + 3
                                    else:
                                        if ord(var[2]) <= ord(var[0]) <= ord(
                                                var[1]):
                                            value = 100000 * (
                                                ord(var[2]) - 64) + 3500 * (
                                                    ord(var[0]) - 64) + 130 * (
                                                        ord(var[1]) - 64) + 4
                                        else:
                                            value = 100000 * (
                                                ord(var[2]) - 64) + 3500 * (
                                                    ord(var[1]) - 64) + 130 * (
                                                        ord(var[0]) - 64) + 5

                vars.append((value, list))
        vars.sort()
        newClause = []
        for v in vars:
            newClause = newClause + v[1]
        encoding = [
            self.variableSubstition(newClause[i:i + 2])
            for i in range(len(newClause) - 1)
        ]
        for element in encoding:
            encodingClause[self._dictionary.get(tuple(element))] += 1
        encodingClause[1849] = len(clause.get_variables())
        return encodingClause