有 Prolog return 一条适用的规则

Have Prolog return a rule that applies

我有兴趣在术语一次出现时逐步解析序列。这要求我能够确定哪些重写规则可以使用当前输入。因此,从概念上讲,我正在寻找类似以下内容的内容。

对于语法:

abc1 --> [a, b, c]. 
ab --> [a, b].
abc2 --> ab, [c].

以类似于我们将满足目标的参数指定为变量的方式,我想将函子本身指定为变量,例如 T

具体来说,我希望函子 T([a,b,c]) 到 return: T = abc1. 但最终会递归,例如: [abc1, abc2(ab)]

我正在考虑创建一个顶级规则,它将在其主体中枚举所有语法的规则头,并且可能以某种方式 return 可以由这些规则构建的树 T匹配输入但这个枚举看起来很愚蠢,因为 Prolog 无论如何都会枚举规则头,我仍然不确定我是否可以使这个解决方案工作。

除此之外我还想到了prolog的lambda包,但是看了一眼似乎并没有达到我需要的。

更新:

我被指向将仿函数表示为列表的方向,例如,使用 =../2 但似乎这样的解决方案需要我显式实例化 T 到仿函数,称为一个列表。然而,对我来说,重点是让 prolog 通过尝试将变量 T 与可用规则统一起来,直到其中一些使用我提供的参数 [a, b, c], [] 解析为 true 来找到该仿函数。

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

更新二:

我目前正在使用的解决方案是通过 current_functor 查询所有可用的仿函数,以查看输入 [a, b, c], [] 满足哪些仿函数。 一旦我有了它们,我只需要它们自我识别,例如,通过将它们的名字传递给调用者的 arg,这似乎也是可行的。 然后我基本上会得到与输入匹配的规则名称。

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

parse(RuleSubtree, Input, []).

哪里

parse(T) -->
    rule1(T);
    rule2(T);

...

    ruleN(T).

并且每条规则自我标识如下

ruleN(ruleN(SubRule1, SubRule2, ... SubRuleN)) --> 
    ruleX(SubRule1), ruleY(SubRule2), ... ruleZ(SubRuleN).

这在变量 T.

中给出了与输入匹配的规则结构

可能有点硬编码,但它对我的目的有用,并允许我推进我的实验,在这个过程中还有更严峻的挑战。