L'insieme dei numeri naturali N
è chiusa sotto addizione e sottrazione:
N + N = N
N - N = N
Ciò significa che l'aggiunta o la sottrazione di due numeri naturali è anche un numero naturale (considerando 0 - 1
è 0
e non -1
, abbiamo non può avere numeri naturali negativi).
Tuttavia, l'insieme dei numeri naturali N
non è chiusa rispetto operazioni relazionali:
N < N = {0, 1}
N > N = {0, 1}
Ciò significa che il risultato del confronto tra due numeri naturali è o veridicità (cioè 1
) o falso (cioè 0
).
Pertanto, consideriamo l'insieme di valori booleani (ad esempio {0, 1}
) come un insieme limitato di numeri naturali (ad esempio N
).
false = 0
true = incr(false)
La prima domanda che dobbiamo rispondere è “ come possiamo codificare if
dichiarazioni in modo che possiamo ramo basata o veridicità o la falsità?” La risposta è semplice, usiamo l'operazione loop
:
isZero(x) {
y = true
loop x { y = false }
return y
}
Se la condizione del ciclo è true
(cioè 1
) allora il ciclo viene eseguito esattamente una volta. Se la condizione del loop è false
(ad esempio 0
), il ciclo non viene eseguito. Possiamo usarlo per scrivere il codice di diramazione.
Quindi, come definiamo le operazioni relazionali? Risulta, tutto può essere definito in termini di lte
:
lte(x, y) {
z = sub(x, y)
z = isZero(z)
return z
}
Sappiamo che x ≥ y
è lo stesso di y ≤ x
. Pertanto:
gte(x, y) {
z = lte(y, x)
return z
}
Sappiamo che se x > y
è vero allora x ≤ y
è falso. Pertanto:
gt(x, y) {
z = lte(x, y)
z = not(z)
return z
}
Sappiamo che x < y
è lo stesso di y > x
. Pertanto:
lt(x, y) {
z = gt(y, x)
return z
}
Sappiamo che se x ≤ y
e y ≤ x
poi x = y
. Pertanto:
eq(x, y) {
l = lte(x, y)
r = lte(y, x)
z = and(l, r)
return z
}
Infine, sappiamo che se è vero allora x = y
x ≠ y
è falso. Pertanto:
ne(x, y) {
z = eq(x, y)
z = not(z)
return z
}
Ora, tutto quello che dobbiamo fare è definire le seguenti funzioni:
La funzione sub
è definito come segue:
sub(x, y) {
loop y
{ x = decr(x) }
return x
}
decr(x) {
y = 0
z = 0
loop x {
y = z
z = incr(z)
}
return y
}
La funzione not
è la uguale alla funzione isZero
:
not(x) {
y = isZero(x)
return y
}
La funzione and
è la stessa della funzione di mul
:
and(x, y) {
z = mul(x, y)
return z
}
mul(x, y) {
z = 0
loop x { z = add(y, z) }
return z
}
add(x, y) {
loop x
{ y = incr(y) }
return y
}
Questo è tutto ciò che serve. Spero possa aiutare.
Forse ti interesserebbe conoscere il [calcolo Lambda] (https://en.wikipedia.org/wiki/Lambda_calculus) e [Church encoding] (https://en.wikipedia.org/wiki/ Church_encoding). La tua domanda è direttamente risposta in questi due articoli. –
Dovresti accettare la mia risposta se ha risolto il tuo problema. Clicca sul segno di spunta accanto alla mia risposta. –