让Prolog返回一个适用的规则

让Prolog返回一个适用的规则,prolog,context-free-grammar,dcg,Prolog,Context Free Grammar,Dcg,我对增量解析序列感兴趣,因为术语一次一个。这要求我能够确定哪些重写规则可以使用当前输入。因此,从概念上讲,我正在寻找以下内容 语法方面: abc1 --> [a, b, c]. ab --> [a, b]. abc2 --> ab, [c]. 类似于我们将满足目标的参数指定为变量,我想将函子本身指定为变量,例如,T 具体地说,我希望函子T([a,b,c])返回:T=abc1。但最终是递归的:[abc1,abc2(ab)] 我想制定一个最高级别的规则,它将在其主体中枚举所有语

我对增量解析序列感兴趣,因为术语一次一个。这要求我能够确定哪些重写规则可以使用当前输入。因此,从概念上讲,我正在寻找以下内容

语法方面:

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来找到该函子

换句话说,我需要
调用(T[a,b,c],])。
才能工作,但它说
T
没有充分实例化

更新2:

我目前使用的解决方案是通过
current\u functor
查询所有可用的functor,以查看输入满足哪些条件。 一旦我有了他们,我只需要他们自我识别,例如,通过将他们的名字从呼叫者传给arg,这似乎也是可行的。
然后,我将基本上获得与输入匹配的规则的名称。

最后,我在一个顶级规则中明确列举了所有语法的自识别规则头:

parse(RuleSubtree, Input, []).
在哪里

每个规则的自我识别如下

ruleN(ruleN(SubRule1, SubRule2, ... SubRuleN)) --> 
    ruleX(SubRule1), ruleY(SubRule2), ... ruleZ(SubRuleN).
它在变量
T
中提供了与输入匹配的规则结构


可能有一点硬编码,但它符合我的目的,允许我继续我的实验,在这方面还有更严峻的挑战。

你能给出一个更具体的例子,说明你希望如何工作,而不仅仅是
T([a,b,c])
?或者更确切地说,一个更具体的查询是什么样的?您还熟悉
=../2
谓词吗<代码>s(A、B、C)=。。[s,A,B,C],您可以使用
T=s,调用(T,A,B,C)
查询
s(A,B,C)
。如上所述,它看起来像,
s(T,[it,sleeps],],T=。。[X |].
将解决您的问题(
X
result)。是的,您是对的,
=../2
要求实例化函子,这样显然对您不起作用。一开始我并不完全理解你想要达到的目标。您需要一个预定义的谓词,它可以将所有子句枚举到列表或其他内容中,这样您就可以调用它们并知道调用了哪一个。我认为这样的谓词不存在。通常,如果您需要规则具有自我识别能力,您可以将自我识别能力构建到规则中。这是因为您将自我识别能力构建到了规则中。:)你的实际规则,以
s(s(NP,VP))
作为一个头部,对于你正在识别的东西来说是一种“元规则”,即
s(NP,VP)
。但你真正想要的是规则本身,听起来像。要将这一概念应用到您的简单示例
abc1-->a,b,c.
(应该正确地将其写成
abc1-->[a,b,c]。
,您可以将其写成
s(abc1-->[a,b,c]。
。然后您可以说,
短语(s(T),[a,b,c])
并提出
T=abc1
。因此
s
已将自己确定为规则
abc1
。您能否尝试将这些评论总结到您的问题中?或许可以给出一个完整的示例,说明您的输入将是什么,以及您期望的结果是什么?正如您所说,您可能没有以最有用的方式思考这个问题嗯,但我觉得很难判断。也许会有用
    ruleN(T).
ruleN(ruleN(SubRule1, SubRule2, ... SubRuleN)) --> 
    ruleX(SubRule1), ruleY(SubRule2), ... ruleZ(SubRuleN).