让Prolog返回适用

时间:2016-02-17 00:20:22

标签: 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)]

我正在考虑创建一个顶级规则,它会在其体内枚举所有语法的规则头,并且可能以某种方式返回可以由与输入匹配的规则构建的树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,这似乎也是可行的。 然后我基本上会得到与输入匹配的规则名称。

1 个答案:

答案 0 :(得分:0)

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

parse(RuleSubtree, Input, []).

,其中

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

...

    ruleN(T).

并且每条规则都自我识别如下

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

它为变量T提供了与输入匹配的规则结构。

也许有点硬编码,但它适用于我的目的,并允许我推进我的实验,在途中有更严重的挑战。