如何在没有剪切的情况下在PROLOG中匹配包装变量?

时间:2014-05-25 14:36:04

标签: design-patterns prolog pattern-matching wrapper prolog-cut

我对Prolog程序员有一个非常简单的问题。这应该很容易,但我没有任何使用该语言的经验,所以请帮忙。 我试图在Prolog中解释一些简单的编程语言。在这种语言中,我可以有两种类型的变量 - 简单变量和数组变量。我有一个函数来计算给定变量的值:

%calc(+var, +state, -result)

变量既可以是x之类的简单变量,也可以是array(ident, index)之类的数组变量。我不知道如何在Prolog中编写该函数,因此它对常规变量和数组变量有不同的作用。我想出了类似的东西:

calc(array(Ident,I), S, R) :- calculating R for array var, !.
calc(Ident, S, R) :- calculating R for regular var.

这有效,但必须有更好的方法。

1 个答案:

答案 0 :(得分:3)

有一种干净的方法:使用专用的变量包装器,这样你就可以通过模式匹配来识别它们。例如:

calc(array(Ident,I), S, R)  :- calculating R for array var.
calc(variable(Ident), S, R) :- calculating R for regular var.

我使用仿函数variable/1来识别变量。

处理此表示不需要!/0,您可以将谓词用作真实关系,即在所有方向上。

您可能需要一个预处理步骤,在解析给定程序期间或之后使用专用仿函数包装变量。在那之后,你有了这个干净的表示,并且可以在整个程序的其余部分使用模式匹配。