解析和计算布尔集定义

2024-04-05

说我有一套S定义为字符串,例如如下:

S = '(A or B) and not(A and C)'

其中 A、B 和 C 是有限集,例如:

A = {0, 1}
B = {0, 2}
C = {1, 3}

如果我们分析S一步一步,我们有:

(A or B)   = {0, 1, 2}
(A & C)    = {1}
not(A & C) = {0, 2, 3}

这给了我们最终结果:

S = {0,2}

我如何计算元素S给出其作为一般布尔公式的定义?

我不太知道如何开始解决这个问题。一方面,我想知道是否需要使用完整的词法分析器。另外,经过一番阅读后,我还发现了两个似乎高度相关的概念,但不知道它们如何应用:

  • 规范范式 http://en.wikipedia.org/wiki/Canonical_normal_form
  • 德摩根定律 http://en.wikipedia.org/wiki/De_Morgan%27s_laws

如果您愿意进行改造,则无需编写自己的解析器S到适合使用的字符串eval() http://docs.python.org/2.7/library/functions.html#eval。改变S from '(A or B) and not(A and C)'转化为等价的T使用Python的in-操作员'(x in A or x in B) and not(x in A and x in C)'.

通过循环元素域并测试它们是否与上面的表达式匹配来计算结果。 这是交互式提示下的一个已解决的示例:

>>> T = '(x in A or x in B) and not(x in A and x in C)'
>>> sets = {'A': {0, 1}, 'B': {0, 2}, 'C': {1, 3}}
>>> universe = {x for s in sets.values() for x in s}
>>> {x for x in universe if eval(T, sets, {'x': x})}
set([0, 2])

要自动进行转换,请为集合变量创建一个命名空间,其中变量查找执行集合成员资格测试。将它们放在一起为您提供了一个简单而干净的集合表达式求值器:

class SetVariables(dict):
    'Transform a variable lookup into a membership test'
    def __getitem__(self, var):
        s = dict.__getitem__(self, var)
        return self.x in s

def set_eval(expr, **sets):
    'Evaluation a set expression for the given sets'
    universe = {x for s in sets.values() for x in s}
    expr = compile(expr, '', 'eval')
    variables = SetVariables(sets)
    results = set()
    for x in universe:
        variables.x = x
        if eval(expr, {}, variables):
            results.add(x)
    return results

if __name__ == '__main__':
    print set_eval(expr = '(A or B) and not(A and C)',
                   A = {0, 1},
                   B = {0, 2},
                   C = {1, 3}
                  )

希望这能解决您的问题并使您不必编写自己的解析器:-)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解析和计算布尔集定义 的相关文章

  • 在云服务器中运行 python 脚本的最简单方法是什么?

    我有一个网络爬行 python 脚本 需要几个小时才能完成 并且无法在我的本地计算机上完整运行 有没有一种方便的方法可以将其部署到简单的 Web 服务器 该脚本基本上将网页下载到文本文件中 如何最好地实现这一点 谢谢 既然你说性能是一个问题
  • 尝试通过 API 将成员添加到 Google 群组时出现“缺少必填字段:成员”

    尝试使用 Google 管理目录 API 来读取 google 群组 组织 的成员 它工作正常 当我尝试添加成员时 我得到 errors domain global reason required message Missing requi
  • 使用SchemDraw库自动保存图像

    我想在Python中使用这个库来生成电气图 https cdelker bitbucket io SchemDraw https cdelker bitbucket io SchemDraw 我想在服务器中运行这段代码 这个想法是生成图像
  • 在 C# 整数运算中,a/b/c 是否始终等于 a/(b*c)?

    设a b和c为非大正整数 对于 C 整数算术 a b c 是否始终等于 a b c 对我来说 在 C 中它看起来像 int a 5126 b 76 c 14 int x1 a b c int x2 a b c 所以我的问题是 x1 x2对于
  • 如何动态构造方法?

    我设计了一个类 它非常标准 具有一些方法属性 class foo def f1 self print f1 def f2 self print f2 def fn self print fn 现在我想创建一个包含一组 foo 实例的类 cl
  • Python pandas cumsum() 在达到最大值后重置

    我有一个 pandas DataFrame 其中 timedeltas 作为这些增量的累积和 在单独的列中以毫秒表示 下面提供了一个示例 Transaction ID Time TimeDelta CumSum ms 1 00 00 04
  • 为 Mercurial 执行 hgweb.cgi 时,指定的 CGI 应用程序行为不当...

    我有 IIS 6 我将 Mercurial 安装在 c program files mercurial 中 我在 c program files python 中安装了 Python 2 6 I added extension handli
  • 如何使用生成器遍历文件系统?

    我正在尝试创建一个实用程序类来遍历目录中的所有文件 包括子目录和子子目录中的文件 我尝试使用发电机 因为发电机很酷 然而 我遇到了困难 def grab files directory for name in os listdir dire
  • 用python计算网页大小

    我将如何使用 Python 计算网页 url 的大小 我尝试了 urllib2 并获取内容长度标头 但它不存在 import urllib2 url http www google com r urllib2 urlopen url Not
  • 将 Pandas 列转换为日期时间

    我在 pandas DataFrame 中有一个字段以字符串格式导入 它应该是一个日期时间变量 如何将其转换为日期时间列 然后根据日期进行过滤 Example raw data pd DataFrame Mycol 05SEP2014 00
  • 有效地减去不同形状的 numpy 数组

    使用 numpy 出色的广播规则 您可以减去形状 3 数组v来自形状 5 3 数组X with X v 结果是一个形状 5 3 数组 其中每一行i是有区别的X i v 有没有办法减去形状 n 3 数组w from X使得每一行w从整个数组中
  • Apache2 mod_wsgi 403 禁止错误

    我已经正确配置了它 但后来我决定重新安装我的 Debian 顺便从 wheezy 切换到 jessie 版本 问题是这样的 我有一个 python mod wsgi 应用程序 mnt doc Python www index py ls l
  • 找到两个移动物体的更好交点

    我想极大地优化我的算法之一 我将尽力以最好的方式解释它 主题 我们当时处于二维欧几里德系统中t 0 在这个系统中有两个对象 O1 and O2 O1 and O2分别位于点PA and PC O1移动于常数和已知点方向的速度PB 当物体到达
  • python:Windows终端中的unicode,使用的编码?

    我在 Windows 7 终端中使用 Python 解释器 我正在尝试了解 unicode 和编码 I type gt gt gt s gt gt gt s x89 gt gt gt u u gt gt gt u u xeb 问题1 字符串
  • Python:使用 FOR 循环插入字典

    我已经在论坛中进行了搜索 但不明白是否可以使用以下构造将新条目插入到我的 Python 字典中 而不将其转换为列表 for x in range 3 pupils dictionary new key input Enter new key
  • 使用 std::set 时重载运算符<

    这是我第一次使用 std set 容器 并且我对操作符 std less 遇到了问题 我声明该集合 std set
  • 如何检查一个盒子是否适合另一个盒子(允许任何旋转)

    假设我有两个盒子 每个盒子都是一个长方体 http en wikipedia org wiki Rectangular cuboid aka长方体 我需要编写一个函数来决定盒子是否具有尺寸 一 二 三 可以装入具有尺寸的盒子中 甲 乙 丙
  • 如何提取Python代码文件中使用的函数?

    我想创建代码文件中使用的所有函数的列表 例如 如果我们在名为 add random py 的文件中有以下代码 import numpy as np from numpy import linalg def foo print np rand
  • Seaborn 分组条形图,使用总值而不是平均值

    我有一个关于如何组织数据以使用 seaborn 制作条形图的问题 我的数据输入如下所示 influencer platform reach person a instagram 10000 person b instagram 5000 p
  • 将下载的字体添加到 Tkinter

    我想下载一个开源字体并在我的 Python Tkinter 程序中使用它 如何告诉 Tkinter 从目录导入字体或将字体放在与程序相同的文件夹中 Note 我已经寻找答案一段时间了 甚至阅读了 Tkinter 的 API 参考 了解我能找

随机推荐

  • 如何从一条路径中减去另一条路径?

    所以 我有一个基本路径和一个新路径 新路径包含在基本路径中 我需要看看新路径有什么不同 就像我们有 home 一样 新路径是 home apple one 我需要从中获取 apple one 注意 当我从 homePath diffPath
  • Spring @ContextConfiguration 如何为 xml 放置正确的位置

    在我们的项目中 我们正在编写一个测试来检查控制器是否返回正确的模型视图 Test public void controllerReturnsModelToOverzichtpage ModelAndView modelView new Mo
  • 并发程序不同制作方式的差异

    有什么区别 开始一个新线程 使用 TPL 使用后台工作者 所有这些都创建了并发性 但是它们之间的低级差异是什么 无论如何 这 3 个线程都会创建线程吗 Thanks 它们都在内部使用线程 区别在于每个 API 的抽象级别以及线程的使用方式
  • 在 Flask 框架中向用户发送文件会出现 UnicodeEncodeError

    我想在用户单击适当的按钮时向他发送一个文件 并且我正在起诉以下内容 Prepare selected file for download send file home nikos wsgi static files filename 但无论
  • 在不同的服务器上执行相同的 php 脚本的最佳方法是什么?

    我有一个名为 MY SCRIPT 的脚本 由于性能问题 我需要将其上传到不同的服务器 A B 和 C 上 该脚本对于所有服务器都是相同的 减少维护的最佳方法是什么 我在想 你怎么看待这件事 使用部署工具自动将此文件部署到多个服务器 就像是A
  • Facebook OAuth2 中 access_token 的长度是多少?

    我在 Google 和 StackOverflow 上搜索以找到问题的答案 但找不到 我想将 access token 存储到我的数据库中以供离线访问 并且我想确保指定列的正确长度 我什至无法确定它只是一个数字还是数字和字符串的混合 我在
  • Spring 自动添加“X-Total-Count”标头

    我正在为我的 Web 应用程序使用 admin on rest UI 它有以下限制 注意 jsonServer REST 客户端期望 API 包含 响应 GET LIST 调用中的 X Total Count 标头 该值必须 是集合中资源的
  • Android:BLE如何读取多个Characteristic?

    用于读取某些特征的 Android BLE API 方法本质上是异步的 当您请求某些值时 将调用您的 GATT 回调方法 如果您请求多个读取特征值 它只会丢弃其他值 直到它不满足第一个请求为止 如果有人知道我们应该采用哪种设计模式来解决这个
  • 链接时,“获取您需要的内容”和“获取全部”(-Wl,--whole-archive)之间是否存在某种关系?

    我有这个库 其中涉及一些需要在之前运行的静态初始化代码main 如果您只是将所有翻译单元编译在一起 那么一切都很好 但是如果我提供静态库 a文件 并让用户将他们的应用程序链接到它 链接器只是忽略执行静态初始化的符号 或者 我可以让链接器拾取
  • 检查文件夹,然后在 Python 中创建一个隐藏文件夹

    我无法让这个东西为我的一生创建这个隐藏文件夹 它完成时没有任何错误 只是无法让它创建文件夹 import os import ctypes import subprocess import urllib from subprocess im
  • 问:如何从表中排除人名

    我正在尝试使用 bigquery 通过 gdeltv2 数据集查找 4 个以色列新闻网站中被提及最多的 10 个人 我成功获得了被提及最多的 10 个人 现在我想从前 10 名名单中排除两个人 Maccabi Haifa 和 Reuben
  • 故障转移组辅助实例上的 Azure SQL 托管实例 CLE 的解密问题

    我们有一个带有主实例和辅助实例的 Azure SQL 托管实例故障转移组设置 我遇到的问题是我们对某些数据库表列使用单元格 列 级加密 CLE 我有限的理解是 这些的解密取决于服务主密钥 我认为问题在于数据库主密钥使用服务主密钥进行加密 然
  • Mac OS X 上的 Mono - 并行 HTTP 下载限制为 2

    我正在使用 Mono 开发一个可以同时下载多个文件的程序 适用于 Mac OS X 和 Debian 然而 尽管我使用了构造函数 但我只能同时下载 2 个文件new RollingDownload 10 我正在使用的代码是这样的 using
  • 如何改进MySQL中的Limit子句

    我有posts有 10k 行的表 我想通过它创建分页 因此 我为此目的有下一个查询 SELECT post id FROM posts LIMIT 0 10 When I Explain该查询我得到下一个结果 所以我不明白为什么 MySql
  • NetBeans 14 - 无法自动设置 JavaFX 平台

    我多年来一直在研究这个问题 但我发现的所有教程似乎都不起作用 当我尝试使用 JDK 18 和适用于 Windows 的最新 JFX 下载在 Netbeans 14 中创建新的 JavaFX 项目时 https gluonhq com pro
  • 如何在 iOS 4 上获取更新 NSUserDefault?

    我正在开发一个iPhone应用程序 由于多任务 我在iOS4上遇到了问题 此应用程序具有在 Settings bundle 中定义的默认设置 如果我运行我的应用程序 那么我就会离开它 所以它会进入后台 我将更改设置并重新启动应用程序 它退出
  • 根据最后一行的条件触发电子邮件警报“不工作”

    我尝试构建一个脚本 但存在一些问题 表格格式为两列 即日期和值 这些是需求 理想状态 抓住 Google 表格中名为 test 的最后一个填充行 今天的日期 如果 F 列中的值大于 0 5 请检查该行 如果大于 0 5 则触发电子邮件 在电
  • Camel Restlet maxThreads 组件选项

    我有个问题 apache Camel 文档指出 camel restlet 组件 从 2 10 版本开始 可以定义服务请求的最大线程数 http camel apache org restlet html 我该如何指定这个参数 这是我制定的
  • Magrittr 转发管道无法将值转发到 openXL::addWorksheet - “错误...:第一个参数必须是工作簿”

    magrittr似乎无法将 工作簿 类对象通过管道传输到addWorkbook包中的函数openxlsx 别介意为什么我需要使用 excel 哎哟 例如 要写InsectSprays使用 基本 语法将数据集转换为 Excel 文件 libr
  • 解析和计算布尔集定义

    说我有一套S定义为字符串 例如如下 S A or B and not A and C 其中 A B 和 C 是有限集 例如 A 0 1 B 0 2 C 1 3 如果我们分析S一步一步 我们有 A or B 0 1 2 A C 1 not A