我有兴趣逐步解析序列,因为这些术语一次只有一个。这要求我能够确定哪些重写规则可以消耗当前输入。所以,从概念上讲,我正在寻找以下内容。
语法:
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,这似乎也是可行的。
然后我基本上会得到与输入匹配的规则名称。
答案 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
提供了与输入匹配的规则结构。
也许有点硬编码,但它适用于我的目的,并允许我推进我的实验,在途中有更严重的挑战。