This file is indexed.

/usr/share/hol88-2.02.19940316/Library/trs/extract.ml is in hol88-library-source 2.02.19940316-19.

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
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
% extract.ml                                            (c) R.J.Boulton 1990 %
%----------------------------------------------------------------------------%


% Function to take a term and return a triple:     %
% (<constants>,<free variables>,<bound variables>) %

% Set union and set difference are used to avoid generating repetitions in   %
% the lists derived. For function applications, the lists from the rator and %
% the rand can simply be joined by set union. For abstractions, the bound    %
% variable is removed from the free-variable list of the body, and is added  %
% to the bound-variable list of the body.                                    %

letrec get_ids t =

   % : (term -> (term list # term list # term list)) %

   if (is_const t) then ([t],[],[])
   if (is_var t)   then ([],[t],[])
   if (is_abs t)   then
     (let (bv,body) = dest_abs t
      in  let (cl,fvl,bvl) = get_ids body
          in  (cl,(subtract fvl [bv]),(union bvl [bv]))
     )
   if (is_comb t)  then
     (let (a,b) = dest_comb t
      in  let (cla,fvla,bvla) = get_ids a
          and (clb,fvlb,bvlb) = get_ids b
          in  (union cla clb,union fvla fvlb,union bvla bvlb)
     )
   else fail;;


% Functions to extract components from the get_ids triple %

let get_consts t = (fst o get_ids) t;;

   % : (term -> term list) %


let get_freevars t = (fst o snd o get_ids) t;;

   % : (term -> term list) %


let get_boundvars t = (snd o snd o get_ids) t;;

   % : (term -> term list) %


% Function to obtain a list of the types which occur in a term %

% The lists of constants, free-variables and bound-variables are        %
% concatenated. The resulting identifiers are converted to their types, %
% and then any repetitions are removed.                                 %

let get_types t =

   % : (term -> type list) %

   let (cl,fvl,bvl) = get_ids t
   and get_typ t = snd (dest_const t ? dest_var t)
   in  remove_rep (map get_typ (cl @ fvl @ bvl));;


%--------------------------------------------------------------------------%


% Function which applied to a HOL type returns true if the type is of the %
% form ":*..." or ":op", otherwise false is returned.                     %

let is_primtype typ = (null (snd (dest_type typ))) ? true;;

   % : (type -> bool) %


% Function which applied to a HOL type returns a list containing simply %
% the type itself if it is `primitive' or the types from which it is    %
% constructed otherwise.                                                %

let subtypes typ =

   % : (type -> type list) %

   if (is_primtype typ)
   then [typ]
   else (snd (dest_type typ));;


% Function to break-up a type into its `primitive' types %

% The function uses the predicate is_primtype, defined above. If the     %
% type is not `primitive', a list of the component types is obtained, to %
% which the function is applied recursively. The resulting list of lists %
% is then `flattened' to give a list of `primitive' types, from which    %
% any repetitions are removed.                                           %

letrec prim_subtypes typ =

   % : (type -> type list) %

   if (is_primtype typ)
   then [typ]
   else (remove_rep o flat o (map prim_subtypes) o subtypes) typ;;


% Function to obtain a list of the `primitive' types occurring in a term %

% A list of the types occurring in the term is obtained. Each of these %
% types is converted to a list of its `primitive' types. The resulting %
% list of lists is then `flattened', and any repetitions are removed.  %

let get_primtypes t =

   % : (term -> type list) %

   (remove_rep o flat o (map prim_subtypes) o get_types) t;;


% Function to obtain a list of the `primitive' polymorphic types in a term %

let get_primvartypes t = filter is_vartype (get_primtypes t);;

   % : (term -> type list) %


%----------------------------------------------------------------------------%