prolog - 在子句头中使用 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]
有谁知道这是否可能?
解决方案
事实上,这是 Prolog 中缺少的功能(在 Haskell 中,它被称为“as-patterns”;infoo( x@(a:b) ) = ...
x
指的是整个 whilea
并b
指代它的部分)。
你能做的最接近的事情是
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 的术语总是未经评估的,象征性的。
推荐阅读
- android - 将 Long 转换为特定条件格式
- android - 如何禁用“解决粘贴的引用”?
- javascript - 如何在 Three.js 中使用 dat.gui 来控制 STL 的不透明度、颜色等属性
- .htaccess - htaccess 中的重定向问题
- java - 如何创建一个独立的基于 Spring Boot 的 Java 库
- matlab - MATLAB 中 Base Workspace 和 Simulink 之间的全局变量
- wordpress - 禁用网站 Wordpress 的 HTTP 版本
- r - 查找出现在列中的常用词并将其删除
- python - ValueError:无法将输入数组从形状 (2,2) 广播到 GMM 的形状 (2)
- java - 将 Web 应用程序部署到 Weblogic 12c 服务器上