/usr/lib/swi-prolog/library/vm.pl is in swi-prolog-nox 6.6.4-2ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | :- module(prolog_vm,
[ vm_list/1
]).
:- use_module(library(prolog_clause)).
:- use_module(library(lists)).
/** <module> SWI-Prolog Virtual Machine utilities
This is an internal developers module to manage the virtual machine
instructions.
*/
:- meta_predicate
vm_list(:).
%% vm_list(:Spec) is det.
%
% Lists the definition of the predicates matching Spec to
% =current_output=. Spec is also allowed to be a clause-reference.
vm_list(_:Ref) :-
integer(Ref), !,
( nth_clause(_Head, N, Ref),
format('~40c~nclause ~d (~w):~n~40c~n', [0'-, N, Ref, 0'-]),
vm_list_clause(Ref),
fail
; true
).
vm_list(Spec) :-
'$find_predicate'(Spec, List),
( member(PI, List),
pi_to_head(PI, Head),
unify_args(Head, Spec),
predicate_name(Head, Name),
format('~72c~n~w~n~72c~n', [0'=, Name, 0'=]),
( '$fetch_vm'(Head, 0, _, _)
-> vm_list_clause(Head)
; format(' (No supervisor)~n')
),
( nth_clause(Head, N, Ref),
clause(MHead, _, Ref),
same_head(Head, MHead),
format('~40c~nclause ~d (~w):~n~40c~n', [0'-, N, Ref, 0'-]),
vm_list_clause(Ref),
fail
; true
),
fail
; true
).
pi_to_head(M:PI, M:Head) :- !,
pi_to_head(PI, Head).
pi_to_head(Name/Arity, Head) :-
functor(Head, Name, Arity).
vm_list_clause(Clause) :-
vm_list_clause(Clause, 0).
vm_list_clause(Clause, PC) :-
'$fetch_vm'(Clause, PC, NextPC, VMI), !,
format('~t~d~4| ~q~n', [PC, VMI]),
vm_list_clause(Clause, NextPC).
vm_list_clause(_, _).
% Unify the arguments of the specification with the given term,
% so we can partially instantate the head.
unify_args(_, _/_) :- !. % Name/arity spec
unify_args(X, X) :- !.
unify_args(_:X, X) :- !.
unify_args(_, _).
same_head(X, X) :- !.
same_head(H1, H2) :-
strip_module(H1, _, H),
strip_module(H2, _, H).
|