模式匹配(例如在Prolog,ML系列语言和各种专家系统shell中找到)通常通过严格按顺序将元素的查询与数据进行匹配来进行操作。
然而,在像自动化定理证明这样的领域中,需要考虑到一些运算符是关联的和可交换的。假设我们有数据
A or B or C
和查询
C or $X
使用表面语法不匹配,但逻辑上它应与$X
绑定A or B
匹配,因为or
是关联且可交换的。
是否有任何语言的现有系统可以做这类事情?
答案 0 :(得分:6)
关联 - 交换模式匹配自1981 and earlier以来一直存在,并且仍然是热门话题today。
有很多系统可以实现这个想法并使其有用;这意味着当关联性或可交换性可用于使模式匹配时,您可以避免编写复杂的模式匹配。是的,它可能很贵;更好的模式匹配器会自动执行此操作,而不是手动操作。
您可以在使用我们的程序转换系统实现的rewrite system for algebra and simple calculus中看到一个示例。在此示例中,要处理的符号语言由语法规则定义,并且标记具有A-C属性的那些规则。通过解析符号语言生成的树上的重写会自动扩展为匹配。
答案 1 :(得分:5)
maude term rewriter实现了关联和交换模式匹配。
答案 2 :(得分:1)
我从未遇到过这样的事情,而且我只是看得更详细。
默认情况下有一个合理的计算原因 - 在模式匹配之前必须基本上生成输入的所有组合,或者你必须生成匹配子句的完整交叉产品。
我怀疑实现这一点的通常方法是简单地编写两种模式(在二进制情况下),即具有C or $X
和$X or C
的模式。
根据数据的基础组织(通常是元组),这种模式匹配将涉及重新排列元组元素的顺序,这将是奇怪的(特别是在强类型环境中!)。如果它是相反的列表,那么你就会更加不稳定。
顺便说一句,我怀疑你基本上想要的操作是集合上不相交的联合模式,例如:
foo (Or ({C} disjointUnion {X})) = ...
我见过的唯一可以处理任何细节集的编程环境是Isabelle / HOL,我仍然不确定你是否可以构建模式匹配。
编辑:看起来Isabelle的function
功能(而不是fun
)会让你定义复杂的非构造函数模式,除非你必须证明它们是一致的,你可以'再使用代码生成器。
编辑2:我在n
交换,关联和传递运算符上实现类似功能的方式是:
我的字词格式为A | B | C | D
,而查询格式为B | C | $X
,其中$X
被允许匹配零个或多个内容。我使用词法排序对它们进行了预先排序,因此变量总是出现在最后一个位置。
首先,您构建所有成对匹配,暂时忽略变量,并根据您的规则记录匹配。
{ (B,B), (C,C) }
如果您将其视为二分图,那么您实际上是在解决perfect marriage问题。存在用于找到这些的快速算法。
假设您找到了一个,那么您会收集关系左侧未显示的所有内容(在此示例中为A
和D
),然后将它们填入变量$X
,您的匹配已完成。显然你可以在这里的任何阶段失败,但如果RHS上没有可用的变量,或者如果LHS上没有任何东西匹配的构造函数(阻止你找到一个完美的匹配),这将主要发生。< / p>
对不起,如果这有点混乱。我写这段代码已经有一段时间了,但我希望这对你有所帮助,甚至一点点!
对于记录,此可能在所有情况下都不是一个好方法。我对子类的'匹配'有非常复杂的概念(即,不是简单的相等),因此构建集或任何东西都不会有效。也许这会在你的情况下起作用,你可以直接计算不相交的联盟。