有 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
.
中给出了与输入匹配的规则结构
可能有点硬编码,但它对我的目的有用,并允许我推进我的实验,在这个过程中还有更严峻的挑战。
我有兴趣在术语一次出现时逐步解析序列。这要求我能够确定哪些重写规则可以使用当前输入。因此,从概念上讲,我正在寻找类似以下内容的内容。
对于语法:
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
.
可能有点硬编码,但它对我的目的有用,并允许我推进我的实验,在这个过程中还有更严峻的挑战。