将列表格式化为 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
取决于在标志上)。
离开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
取决于在标志上)。