首页 > 解决方案 > 在子句头中使用 var 解构(Prolog)

问题描述

我目前正在使用 SWI-Prolog 编写一些代码。当我几年前使用 Prolog 时,我可以发誓我能够在子句头中将变量名设置为“解构”,但现在它似乎无法正常工作(至少在 SWI-Prolog 中)。

玩具愚蠢的例子:

    example(X = [Row|Rows]) :-
      do_something_with_x(X), 
      do_something_with_row(Row),
      ...

我想将其称为 egexample( [1,2,3] )并且我希望两者都匹配 和 与同一个谓词的参数相匹配,即谓词正文中的第一个参数(此处为X)。[Row|Rows][1,2,3]

有谁知道这是否可能?

标签: prologpattern-matching

解决方案


事实上,这是 Prolog 中缺少的功能(在 Haskell 中,它被称为“as-patterns”;infoo( x@(a:b) ) = ... x指的是整个 whileab指代它的部分)。

你能做的最接近的事情是

pred(X) :- X = [A|B], 
    ... .

但是也,

pred(X, [A|B]) :- 
    ... . 

虽然总是用相同的东西调用它两次Z = ... , pred(Z, Z), ...

继续这个想法,你实际上可以定义

pred( X = [A|B], ... ) :- ... .

如您所愿,并注意始终这样称呼它:Z = ... , pred( Z = Z , ...). 你甚至可以定义一些元谓词来使这种翻译自动化,比如

call_at( Pred, Arg ) :- call(Pred, Arg = Arg).

这里的=本身就是句法,它的使用协议赋予了它特殊的意义,即语义。用 Lisp 的说法,Prolog 的术语总是未经评估的,象征性的。


推荐阅读