min
è di solito definito sul lambda calcolo non tipizzata come (usando Caramel's syntax):È possibile implementare `max` efficientemente sul calcolo lambda non tipizzato?
sub a b = (b pred a)
<= a b = (is_zero (sub b a))
min a b = (<= a b a b)
Questo è terribilmente inefficiente. Sub
è quadratico, poiché si applica pred
(che è lineare) b
volte. C'è un'implementazione molto più efficiente di min
come:
min a b succ zero = (a a_succ (const zero) (b b_succ (const zero))))
a_succ pred cont = (cont pred)
b_succ pred cont = (succ (cont pred))
Questo zip attraverso entrambi i numeri in stile continuation passaggio fino a raggiungere il primo zero. Ora, sto cercando di trovare una max
che è efficiente come min
, che ha le seguenti proprietà:
a
eb
vengono utilizzati più di una volta sul corpo della funzione.Ha una forma normale beta (vale a dire, non utilizza i combinatori a virgola fissa è fortemente normalizzante).
Esiste la definizione max
?
Mi ricordo che Loic Colson ha indagato su questo tipo di problemi: Sistema T, chiamata per valore e problema minimo, TCS 206, 1998. Ho dato un'occhiata ma non ho trovato nulla di specifico su max. –
@AndreaAsperti ah si scopre che il problema non è poi così difficile, lasciami rispondere – MaiaVictor
@AndreaAsperti oh ho appena notato che ho chiesto 'a' e' b' di essere usati una sola volta. Accidenti a me e alle mie domande impegnative. – MaiaVictor