在sicstus-prolog上破解clpz的上下文中,我想看看 SICStus Prolog 生成的warren-abstract-machine代码。例如,让我们剖析以下谓词!
is_list([]).
is_list([_|Es]) :- is_list(Es).
这就是我现在正在做的事情:
将 2 个子句拆分
is_list/1
为 2 个单独的谓词并添加 2 个虚拟子句:is_list__clause1(dummy1)。 % 虚拟子句 is_list __clause1 ([])。 is_list__clause2(dummy2)。 % 虚拟子句 is_list __clause2 ([_|Es]) :- is_list(Es)。
(Ab-)像这样使用 SICStus prolog-toplevel:
| ?- is_list__clause1(X)。 X = 虚拟 1 ?t … 0x7eff37281300:GET_NIL_X0 0x7eff37281304:继续 0x7eff37281308:END_OF_CLAUSEQ 用户:is_list__clause1/1 … | ?- is_list__clause2(X)。 X = 虚拟 2 ?t … 0x7eff37281150:GET_LIST_X0 0x7eff37281154: U2_VOID_XVAR 1,x(0) 0x7eff37281160:执行用户:is_list/1 0x7eff37281170:END_OF_CLAUSEQ 用户:is_list__clause2/1 …</pre>
这个输出——尽管有点神秘——让我对 WAM 级别的情况有所了解。我喜欢!
但是有一个更简单的方法......请帮助!