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]谓词主体中的第一个参数(此处为)。
有谁知道这是否可能?
实际上,这是 Prolog 中缺少的功能(在 Haskell 中,它被称为“as-patterns”;infoo( x@(a:b) ) = ... x指的是整个 whilea并b指的是它的部分)。
你能做的最接近的事情是
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 的术语总是未经评估的、象征性的。