Известная апория Зенона[0] о том, что Ахиллес не сможет догнать черепаху, потому что за время, когда он достигнет её исходного положения, она успеет отползти дальше, после чего всё повторится — это очередная логическая загадка, которая до сих пор вводит в заблуждение многих людей, но оказывающаяся неприлично простой, если для её рассмотрения использовать язык программирования[1].
÷ 0
Почему математика работает?
В основе естественных наук лежит математика. И открытые законы природы, описанные в математическом виде, обладают огромной предсказательной силой. Почему? Чего только не выдумывают по этому поводу. Ответ же довольно прост, но, как это часто бывает с простыми ответами, не всем легко его принять.
Превращение O→P
Убого:
MODULE Power;
PROCEDURE Do*(x: REAL; n: INTEGER): REAL;
VAR y: REAL; i: INTEGER;
BEGIN
ASSERT(n >= 0);
y := 1.0; i := n;
WHILE i > 0 DO
IF ODD(i) THEN y := y*x END;
x := x*x; i := i DIV 2
END
RETURN
y
END Do;
END Power.
Уже лучше:
sub power($x real, $n int) {
assert $n < 0;
var $y = 1.0;
while ($n > 0) {
$y *= $x if $n % 2;
$x *= $x;
$n = int($n / 2);
}
return $y;
}
Божественно:
use feature 'current_sub';
sub power{$_[1]?($_[1]%2?$_[0]:1)*__SUB__->($_[0]*$_[0],int $_[1]/2):1}Превращение O→A
Убого:
MODULE Power;
PROCEDURE Do*(x: REAL; n: INTEGER): REAL;
VAR y: REAL; i: INTEGER;
BEGIN
ASSERT(n >= 0);
y := 1.0; i := n;
WHILE i > 0 DO
IF ODD(i) THEN y := y*x END;
x := x*x; i := i DIV 2
END
RETURN
y
END Do;
END Power.
Уже лучше:
power ← f R N R { (x n)
(y) ← 1.0
(↺) n > 0 {
n|2 = 1 ? y ×← x
x ×← x
n ÷← 2
}
y
}
Божественно:
power ← {
⍵=0 : 1
(1 ⍺)[1+2|⍵] × (⍺×⍺) ∇ ⌊⍵÷2
}Превращение O→F
Убого:
MODULE Power;
PROCEDURE Do*(x: REAL; n: INTEGER): REAL;
VAR y: REAL; i: INTEGER;
BEGIN
ASSERT(n >= 0);
y := 1.0; i := n;
WHILE i > 0 DO
IF ODD(i) THEN y := y*x END;
x := x*x; i := i DIV 2
END
RETURN
y
END Do;
END Power.
Уже лучше:
: power ( real x integer n -- real )
real y integer i
n 0 < assert
1.0 =:y
n =:i
begin
i 0 >
while
i odd if y x * =:y then
x x * =:x
i 2 div =:i
end
y
;
Божественно:
: power ( n -- ) ( F: x -- y )
dup 0< if drop fdrop abort then
>r 1e
begin r@ 0> while
r@ 1 and 0<> if fover f* then
fswap fdup f* fswap
r> 2/ >r
repeat
r> drop fnip
;
Превращение O→L
Убого:
MODULE Power;
PROCEDURE Do*(x: REAL; n: INTEGER): REAL;
VAR y: REAL; i: INTEGER;
BEGIN
ASSERT(n >= 0);
y := 1.0; i := n;
WHILE i > 0 DO
IF ODD(i) THEN y := y*x END;
x := x*x; i := i DIV 2
END
RETURN
y
END Do;
END Power.
Уже лучше:
(module Power
(procedure Do ((x REAL) (n INTEGER)) REAL
(var ((y REAL) (i INTEGER)))
(
(assert (>= n 0))
(:= y 1.0)
(:= i n)
(while (> i 0) (
(if (odd i)
(:= y (* y x))
)
(:= x (* x x))
(:= i (div i 2))
))
(return y)
))
)
Божественно:
(define (power x n)
(begin
(when (< n 0) (error "Negative exponent"))
(let ((y 1.0)
(i n))
(let loop ((x x) (i n) (y 1.0))
(if (> i 0)
(let* ((y (if (odd? i) (* y x) y))
(x (* x x))
(i (quotient i 2)))
(loop x i y))
y)))))
Информации суть
Есть известные трудности с определением того, что такое информация. И это понятно, ведь чтобы оперировать этим понятием, система уже должна обладать информационными свойствами, то есть в некотором смысле «знать», что это, на очень глубоком уровне. Здесь мы имеем дело не просто с безусловной рекурсией, приводящей к тавтологичности определения через само себя, а с безусловной мета-рекурсией, выводящей тавтологию на новый уровень. Поэтому невозможно нормально определить, что такое информация, можно только создать непротиворечивое пояснение, используя которое можно было бы создать модель, способную выполнять роль информации в модели мира, функционирующей в информационной же среде, и это тоже может быть полезным.



