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))
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