【发布时间】:2013-06-28 15:49:04
【问题描述】:
我什至不确定它是否称为模式匹配,但我想做一些类似于规则的事情:
我的“对象”具有“能力”属性,该属性是由空格分隔的名称序列。例如:
a.capability = "" // no pattern
b.capability = "foo"
c.capability = "bar"
d.capability = "foo bar"
e.capability = "bar lol truc bidule"
(假设每个对象必须具有与其他对象不同的模式)
然后我有一个全局上下文对象,它也有这样的属性:
context.capability = "" // 1
// OR
context.capability = "foo" // 2
// OR
context.capability = "bar" // 3
// OR
context.capability = "bar foo" // 4
// OR
context.capability = "lol" // 5
现在,我们只想选择一个与上下文能力“最匹配”的唯一对象。 为此,我们遵循以下规则:
- 如果一个对象没有模式并且上下文没有模式,则选择该对象;
- 如果一个对象没有模式并且上下文有模式,如果没有其他对象匹配,则选择该对象;
- 如果一个对象与上下文具有完全相同的模式名称,则它被选中;
- 选择上下文模式中包含的模式名称计数最多的对象;
例如:
- 在上下文案例 1) 中:
a将被选中; - 在上下文案例 2) 中:
b将被选中; - 在上下文案例 3) 中:
c将被选中; - 在上下文案例 4) 中:
d将被选中; - 在上下文案例 5) 中:
e将被选中;
我在写这篇文章时甚至没有测试这条规则是否有效,这只是我想要定义的草稿。
我的问题:
- 你怎么称呼这种算法? (让我可以用正确的名字做未来的研究)
- 是否已经定义了这样的规则?它看起来足够通用,以至于有人以前可以定义类似的规则,但除了定义重载规则的语言标准部分(如 C++ 标准)之外,我找不到类似的东西;
- 是否有研究探索此类算法/规则的属性?我不确定这是否是适合我的用例的正确方法,但它似乎可能是正确的解决方案。但是我没有实现这种语言功能的经验,所以我想看看一些关于我可能会遇到什么问题的数据(但到目前为止我找不到任何东西)。
一位朋友建议看一些关于人工智能、专家系统和语言设计器和编译器实现的书籍。但是,有关如何查找有关这种特定方式的数据的一些指导会很有帮助。
【问题讨论】:
-
单词是否总是按给定的顺序书写?例如,bar 总是保证在 foo 之前出现吗?在上下文和对象中?如果不是,写入值的顺序是否重要?例如,“bar foo”是否等同于“foo bar”?我相信规则 4 意味着排序并不重要,只是想确认一下。
-
@ZeBlob 好问题。起初我认为不,这并不重要,但我还不知道添加顺序作为一种优先级的含义。既然你这么说,我记得 Valve 做过关于这类东西的演示。我将不得不寻找它。现在假设顺序并不重要,只有匹配的值才是重要的(就像它是一个值列表一样)。
-
缺少很多问题上下文。你期望有多少个对象?有多少上下文?有多少不同的能力?您期望每个上下文有多少功能?每个对象有多少能力?上下文或对象是否可以多次列出相同的功能?查询的答案对象是否离上下文“太远”而无用?功能、上下文或对象在编译时是否已知?是否有可以进行预处理的设置阶段?你的目标是什么平台?你的绩效目标是什么? (内存与处理器)
-
不要匆忙投反对票。请解释原因。
-
@Kaganar 1 到 N 个对象,1 个唯一上下文,每个对象/上下文 1 个能力,但它包含 0 到 n 个值(我应该将它呈现为值列表,这样想) .值本身并不重要,任何值都可以在任何对象或上下文的任何能力中。列表中重复的值被视为仅出现一次。我不明白太远的概念。但是,如果有多个匹配对象,可能会出现歧义,我认为描述中没有。不过,这个问题与您的所有问题无关。
标签: string algorithm language-agnostic pattern-matching