#include <perms.h>

//          Edinburgh IMP77 Compiler - Version 8.4
//
//     1  %begin

int main(int argc, char **argv) { /*%begin*/
  _imp_initialise(argc, argv);

  //     2    %routine do fn(%integerfn fred(%integer i))

  void DOFN(int (*FRED)(int I)) {
    //     3      %integer x

    int X;

    //     4      x = fred(1)

    X = FRED(1);

    //     5    %end

    return;
  } /* end of DOFN */

  //     6    %routine do proc(%routine fred(%integer i))

  void DOPROC(void (*FRED)(int I)) {
    //     7      fred(1)

    FRED(1);

    //     8    %end

    return;
  } /* end of DOPROC */

  //     9    %routine do map(%integermap fred(%integer i))

  void DOMAP(int *(*FRED)(int I)) {
    //    10      fred(1) = 1

    *FRED(1) = 1;

    //    11    %end

    return;
  } /* end of DOMAP */

  //    12    %routine do pred(%predicate fred(%integer i))

  void DOPRED(int (*FRED)(int I)) {
    //    13      %return %if fred(1)

    if (!(FRED(1))) goto L_0001;
    return;
  L_0001:;

  //    14    %end

    return;
  } /* end of DOPRED */

  //    15
  //    16    %integerfn fn fred(%integer i)

  int FNFRED(int I) {
    //    17      %result = i

    return I;

    //    18    %end

  } /* end of FNFRED */

  //    19
  //    20    %routine proc fred(%integer i)

  void PROCFRED(int I) {
    //    21    %end

    return;
  } /* end of PROCFRED */

  // ?I unused
  //    22
  //    23    %integermap map fred(%integer i)

  int *MAPFRED(int I)
  {

    //    24      %owninteger j

    static int J;

    //    25      %result == j

    return /*?*/ &J;

    //    26    %end

  } /* end of MAPFRED */

  // ?I unused
  //    27
  //    28    %predicate pred fred(%integer i)

  int PREDFRED(int I) {
    //    29      %true %if i&1 = 0

    if (I & 1 != 0) goto L_0002;
    return 1 /*TRUE*/;
  L_0002:;

  //    30      %false

    return 0 /*FALSE*/;

    //    31    %end

  } /* end of PREDFRED */

  //    32
  //    33  %endofprogram

  _imp_stop(0);
  return 0;
end_0:;
}