将列表格式化为 3SAT 表格

Formatting list into 3SAT Form

离开python有一段时间了,所以没有格式化技巧。想要转换这种格式的东西:

[[8, -6, -4], [-10, 4, 6], [6, -8, -9]] 

变成这样的东西:

(x8 v ~x6 v ~x4) ^ (~x10 v x4 v x6) ^ (x6 v ~x8 v ~x9)

然后能够将每个数字引用为单独的输入以更改为 T 或 F。任何指导将不胜感激。

import random
def sample():
    nums = random.sample(range(-10, 10), 3)
    return nums

exlist = []
boundary = random.randint(3, 10)
count = 0
while (count < boundary):
    count = count + 1
    exlist.append(sample()) 

请注意,0 的情况在你的情况下似乎退化了,所以我假设你没有 0(否则它会变成 x0 或 ~x0 吗?)

假设您将 T/F 存储在如下列表中:

 exvalues = [bool(random.randint(0,1)) for _ in range(10)]

然后你可以像这样简单地计算表达式(不必生成你想要的符号表达式):

all(any(exvalues[x] if x>0 else not exvalues[-x] for x in y) for y in exlist)

说明:你取了所有"sub-expressions"的全局and,每个子表达式都是元素的全局or(可选not取决于在标志上)。