【发布时间】:2016-02-18 05:33:13
【问题描述】:
我对逐步解析序列感兴趣,因为术语一次出现一个。这要求我能够确定哪些重写规则可以使用当前输入。因此,从概念上讲,我正在寻找类似以下的内容。
对于语法:
abc1 --> [a, b, c].
ab --> [a, b].
abc2 --> ab, [c].
类似于我们将满足目标的参数指定为变量,我想将函子本身指定为变量,例如T。
具体来说,我希望函子 T([a,b,c]) 返回:T = abc1. 但最终是递归的,例如:[abc1, abc2(ab)]
我正在考虑创建一个顶级规则,它会在其主体中枚举所有语法的规则头,并可能以某种方式返回可以由与输入匹配的规则构造的树 T,但这个枚举似乎很傻,因为 Prolog 无论如何都会枚举引擎盖下的规则头,我仍然不确定我是否可以使这个解决方案起作用。
除此之外,我想到了prolog的lambda包,但看了一眼似乎并没有达到我所需要的。
更新:
我被指出将仿函数表示为列表的方向,例如,使用=../2,但似乎这样的解决方案需要我明确地将T 实例化为要作为列表调用的仿函数。而对我来说,重点是让 prolog 通过尝试将变量 T 与可用规则统一起来找到该函子,直到其中一些使用我提供的参数 [a, b, c], [] 解析为 true。
换句话说,我需要call(T, [a, b, c],[]). 才能工作,但它说T 没有充分实例化。
更新 2:
我目前采用的解决方案是通过current_functor 查询所有可用的函子,以查看输入[a, b, c], [] 满足哪些函子。
一旦我有了它们,我只需要它们自我识别,例如,通过将它们的名字传递给调用者的 arg,这似乎也是可行的。
然后我基本上会得到与输入匹配的规则的名称。
【问题讨论】:
-
您能否举一个更具体的例子来说明您希望它如何工作,而不仅仅是
T([a,b,c])?或者更具体的查询会是什么样子?您是否也熟悉=../2谓词?s(A,B,C) =.. [s, A, B, C],可以通过T = s, call(T, A, B, C)查询s(A, B, C)。如前所述,看起来s(T, [it, sleeps], []), T =.. [X|_].可以解决您的问题(X结果)。 -
是的,你是对的,
=../2要求实例化函子,所以这显然不适合你。我最初并没有完全理解你想要达到的目标。您需要一个预定义的谓词,它可以将所有子句枚举到一个列表或其他东西中,以便您可以调用它们并知道您调用了哪个。我不认为这样的谓词存在。通常,如果您需要您的规则是自我识别的,您会将自我识别构建到规则中。 -
那是因为您在该规则中内置了自我识别。 :) 您的实际规则(以
s(s(NP,VP))为首)是您要识别的内容的“元规则”,即s(NP, VP)。但你真正追求的是规则本身,听起来像。要将这个概念应用于abc1 --> a, b, c.的简单示例(实际上应该正确地写为abc1 --> [a,b,c].,你应该写为s(abc1) --> [a,b,c].。然后你可以说phrase(s(T), [a,b,c])并想出T = abc1。所以s已将自己标识为规则abc1。 -
您能否尝试将 cmets 总结为您的问题?并且也许制定一个完整的例子来说明您的输入将是什么以及您期望的结果是什么?正如你所说,也许你没有以最有用的方式思考问题,但我觉得很难判断。
-
也许this answer 可能有用
标签: prolog context-free-grammar dcg