在子句标题中使用 vars 进行解构(Prolog)

use*_*634 2 prolog pattern-matching

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

玩具愚蠢的例子:

    example(X = [Row|Rows]) :-
      do_something_with_x(X), 
      do_something_with_row(Row),
      ...
Run Code Online (Sandbox Code Playgroud)

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

有谁知道这是否可能?

Wil*_*ess 5

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

你能做的最接近的事情是

pred(X) :- X = [A|B], 
    ... .
Run Code Online (Sandbox Code Playgroud)

但是也,

pred(X, [A|B]) :- 
    ... . 
Run Code Online (Sandbox Code Playgroud)

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

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

pred( X = [A|B], ... ) :- ... .
Run Code Online (Sandbox Code Playgroud)

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

call_at( Pred, Arg ) :- call(Pred, Arg = Arg).
Run Code Online (Sandbox Code Playgroud)

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