prolog - 如何在 SICStus Prolog 中检查 WAM 代码

标签 prolog sicstus-prolog warren-abstract-machine

在黑客的背景下 我想看一眼由 SICStus Prolog 生成的代码。
例如,让我们剖析以下谓词!

is_list([]).
is_list([_|Es]) :- is_list(Es).

这是我现在正在做的事情:
  • 拆分 is_list/1 的 2 个子句分成 2 个单独的谓词并添加 2 个虚拟子句:

    is_list__clause1(dummy1)。 % 虚拟子句
    is_list__clause1([])。

    is_list__clause2(dummy2)。 % 虚拟子句
    is_list__clause2([_|Es]) :- is_list(Es)。
  • (Ab-) 使用 SICStus 像这样:

    | ?- is_list__clause1(X)。
    X = 虚拟 1 ?吨

    0x7eff37281300:GET_NIL_X0
    0x7eff37281304:继续
    0x7eff37281308:END_OF_CLAUSEQ 用户:is_list__clause1/1

    | ?- is_list__clause2(X)。
    X = 虚拟 2 ?吨

    0x7eff37281150:GET_LIST_X0
    0x7eff37281154:U2_VOID_XVAR 1,x(0)
    0x7eff37281160:执行用户:is_list/1
    0x7eff37281170:END_OF_CLAUSEQ 用户:is_list__clause2/1

  • 这个输出——尽管有点神秘——让我对 WAM 级别的情况有所了解。我喜欢!

    但是有一个更简单的方法......请帮忙!

    最佳答案

    有一种更简单的方法:未记录、不受支持的 library(disassembler) .

    除了 WAM 指令之外,您还可以使用它以编程方式获取有关第一个参数索引的信息。有关更多信息,请参阅来源。

    | ?- use_module(library(disassembler)).
    % ...
    yes
    | ?- [user].
    % compiling user...
    | foo([],Ys,Ys). foo([X|Xs],Ys,[X|Zs]) :- foo(Xs,Ys,Zs). end_of_file.
    % compiled user in module user, 89 msec 599696 bytes
    yes
    | ?- disassemble(foo/3).
    % Predicate: user:foo/3 (user)
    % Varcase: [4343940512-4343958960,4346212208-4343221120]
    % Lstcase: [4346212212]
    % Switch: [[]=4343940516], default: failcode
    % clause indexed [var,number,atom,structure] (user)
    %    4343940512: 'GET_NIL_X0'
    %    4343940516: 'GET_X_VALUE_PROCEED'(x(1),x(2))
    %    4343940528: 'END_OF_CLAUSEQ'(user:foo/3)
    % clause indexed [var,list] (user)
    %    4346212208: 'GET_LIST_X0'
    %    4346212212: 'U2_XVAR_XVAR'(x(3,0),x(0,0))
    %    4346212224: 'GET_LIST'(x(2))
    %    4346212232: 'U2_XVAL_XVAR'(x(3),x(2,0))
    %    4346212244: 'EXECUTE'(user:foo/3)
    %    4346212256: 'END_OF_CLAUSEQ'(user:foo/3)
    yes
    | ?- 
    

    关于prolog - 如何在 SICStus Prolog 中检查 WAM 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57736615/

    相关文章:

    Prolog 'is/2' 谓词实现

    prolog - 列出给定库模块中的谓词

    prolog - SICStus Prolog 垃圾收集跟踪消息

    module - SICStus 的 make/0 功能

    c - 将任意大小的整数从 Prolog 传递到 C

    prolog - WAM 书 : How is code generated when dealing with argument registers (L1)?

    list - 如何在Prolog中列出对象?

    prolog - 帮助学习 Prolog

    prolog - 在 Warren 的抽象机中,参数变量是在哪里创建的?

    prolog - 在沃伦的抽象机器中,如果参数之一是寄存器,绑定(bind)如何工作?