Страницы

Превращение 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)))))

Информации суть

Есть известные трудности с определением того, что такое информация. И это понятно, ведь чтобы оперировать этим понятием, система уже должна обладать информационными свойствами, то есть в некотором смысле «знать», что это, на очень глубоком уровне. Здесь мы имеем дело не просто с безусловной рекурсией, приводящей к тавтологичности определения через само себя, а с безусловной мета-рекурсией, выводящей тавтологию на новый уровень. Поэтому невозможно нормально определить, что такое информация, можно только создать непротиворечивое пояснение, используя которое можно было бы создать модель, способную выполнять роль информации в модели мира, функционирующей в информационной же среде, и это тоже может быть полезным.

Может ли логика исправить неправильное[0] мышление?

Нет.

Для более точного ответа следовало бы провести исследование, но и без него очевидно, что есть одно весомое препятствие. Конечно, логика может облегчить создание правильных суждений, но чтобы правильно применять логику, мышление уже должно быть правильным на довольно высоком уровне. Человек же с неправильным мышлением, скорее, и логику будет применять неправильно. Есть немало ценителей логики, у которых с её применением всё не очень хорошо, и хорошей заявкой на это будет мнение, что это касается кого угодно, но не меня, ведь «я мыслю логично»[1]. В этом смысле логика может сыграть даже отрицательную роль, если человек приобретёт после её неправильного освоения ложную уверенность в своём правильном мышлении.


[0] Здесь под правильным мышлением следует понимать лишь способность решать точные проверяемые задачи
[1] Подробней об этом — тёмной стороне «парадокса» лжеца
[2] Обзор исследований влияния изучения логики и его пересказ: [3] Рассказ Азимова «Логика»

Проблемы сверхобобщённого программирования

В определённой степени программисты всегда пишут обобщённо, ведь программы обычно решают класс задач, а не строго одну задачу, например, решение не конкретного уравнения, а множества уравнений. Кроме того, самые обобщённые коды уже созданы много раз — это алгоритмически полные исполнители. Параметризуя их конфигурацией, в данном случае называемой программой, можно добиться исполнения всего, что возможно в принципе. Но программистам этого мало, и они хотят писать всё более обобщённо, вовлекая в это всё больше деталей на разных уровнях. Такой код следовало бы называть сверхобобщённым, потому что он обобщает обобщения. Этот подход заманчив, ведь он потенциально позволяет меньшими усилиями решать больше задач. Но главная проблема такого кода в том, что: