<?php

define('N',   14   );
define('K',   88   );
define('_',   '_'  );
define('A',   'A'  );
define('Lst', 'Lst');
define('Rez', 'Rez');
define('Cdr', 'Cdr');
define('CdrRez', 'CdrRez');
$hashtable = [
13 => 'N1 is N - 1',
87 => 'K1 is K - 1',
'_' => ''
];
function fu() {
    global $hashtable;
    $code = 'fu(' . @implode(', ', func_get_args()) . ')';
    $hash = '0x' . sprintf('%08x', crc32($code));
    $hashtable[$hash] = $code;
    return $hash;
}
function remove_each_nth() {
    global $hashtable;
    $code = 'remove_each_nth(' . implode(', ', func_get_args()) . ')';
    $hash = '0x' . sprintf('%08x', crc32($code));
    $hashtable[$hash] = $code;
    return $hash;
}
function append() {
    global $hashtable;
    $code = 'append(' . implode(', ', func_get_args()) . ')';
    $hash = '0x' . sprintf('%08x', crc32($code));
    $hashtable[$hash] = $code;
    return $hash;
}

function prolog() {
    global $hashtable;
    foreach(func_get_args() as $argument) {
       $parts = str_split($argument, 10);
       array_walk($parts, function(&$v, $k)use($hashtable) { $v = isset($hashtable[$v]) ? $hashtable[$v] : ' :- ' . $hashtable[-$v];});
       echo implode(".\n", $parts) . ', ';
    }
}
$foo = 1;
$bar = 1;
$baz = 0;
                                                                                prolog($foo?
fu([], _, _, []).
fu(Lst, N, 0, Rez) :-
    append([_], Cdr, Lst),                                                      $bar?
    fu(Cdr, N, N, Rez).
fu(Lst, N, K, Rez) :-
    append([A], Cdr, Lst),
    $K1 = K - 1,
    fu(Cdr, N, $K1, CdrRez),                                                    $baz?
    append([A], CdrRez, Rez).
remove_each_nth(Lst, N, Rez) :-
    $N1 = N - 1,
    fu(Lst, $N1, $N1, Rez).
                                                                                _);
