Существуют ли программы, которые итеративно пишут новые программы?

Примерно через год я думал о написании программы, которая пишет программы. Это было бы прежде всего игривым упражнением, которое могло бы научить меня некоторым новым концепциям. Мое вдохновение исходило из negentropy, и способность к появлению из хаоса и нового хаоса возникла из-за неупорядоченной последовательности.

Чтобы быть более конкретным, программа начнет с написания короткой случайной строки. Если строка компилируется, программы будут записывать ее для последующего сравнения. Если строка не компилируется, программа попытается переписать ее, пока она не скомпилируется. По мере того, как записывается больше строк (мини- "бесполезных" программ), они могут анализироваться на сходства и использоваться для генерации грамматики. Затем эту грамматику можно нарисовать, чтобы написать больше строк, которые имеют более высокую вероятность компиляции, чем чисто случайные строки.

Это, очевидно, более чем глупо, но я подумал, что было бы здорово попробовать и разработать такую ​​программу. И как побочный продукт, я получаю кучу уникальных программ, которые я могу визуализировать и называть искусством.

Я, вероятно, напишу это в Ruby из-за его простой синтаксиса и динамической компиляции, а затем я буду визуализировать обработку с использованием рубиновой обработки.

Что я хотел бы знать:

  • Есть ли название для этого типа программирования?
  • Что в настоящее время существует в этом поле?
  • Кто является основными участниками?
  • БОНУС! - Каким образом я могу процедурно присваивать значение выходным программам за пределами компиляции (y/n)?
    Я могу расширить функциональность этой программы, чтобы сгенерировать программу на основе параметров, но я хочу, чтобы программа определяла эти параметры посредством запуска программ, которые компилируют и присваивают значение выводам программ. Этот вопрос, вероятно, более востребован, чем разумный для бонуса, но если вы можете подумать о простом способе получить что-то вроде этого, сделанного менее чем в 23 строках или одной гиперссылке, пожалуйста, подбросьте его в свой ответ.

Я знаю, что это не совсем мета-программирование, и от того, что я знаю об ИИ и генеративных алгоритмах, они обычно более ориентированы на цели, чем то, что я думаю. То, что было бы оптимальным, - это программа, которая постоянно переписывает и улучшает себя, поэтому мне не нужно ^ _ ^

Ответ 1

Посмотрите "генетическое программирование".

Изменить ответ на комментарии:

@chris, @Кастури: правда. То, что было описано в OP, - это система для выведения грамматики с помощью грубой силы, которая пытается скомпилировать конкретный синтаксис, а затем обратно генерирует новый конкретный синтаксис из грамматики. Если у вас есть что-то очень близко соответствующее этому описанию... лучший совет, который у меня есть, - это изучить скрытую модель Маркова из конкретного синтаксиса на каком-то языке с очень минимальным синтаксисом. Я бы подумал об использовании минимальной комбинаторной логики (что-то похожее на дух на Unlambda).

С другой стороны, генетическое программирование - это техника с некоторой развитой практикой и литературой и не является "детерминированным", а скорее стохастическим процессом. Это также довольно широкий термин --- возможно, система OP является предельным случаем GP с 0% кроссовером и 100% мутацией.

Ответ 2

Слышали ли вы о nanopond? Концепция похожа на вашу. Каждому пикселю предоставляется произвольно сгенерированная строка, которая запускается через компилятор. Обычно это не приводит к какой-либо действительной программе. Однако время от времени произвольно сгенерированная строка каким-то образом будет отформатирована просто идеально, чтобы иметь возможность воспроизводить себя в соседнем пикселе. Вскоре это станет битвой, для которой программа может воспроизводиться лучше, чем другая.

То, о чем вы говорите, это генетический алгоритм, да, но максимизация одной вещи и одна вещь одна: способность воспроизводить.

Это существенное происхождение всего естественно происходящего негэнтропического явления: случайно сформированная сложная сущность обладает способностью к воспроизведению.

Классические генетические алгоритмы налагают критерии искусственного воспроизведения - программа, которая выполняет лучшую работу, искусственно выбирается для воспроизведения.

То, что вы подразумеваете, является своего рода вычислительным естественным отбором. То есть программы будут развиваться на основе их способности воспроизводить себя, и не более того.

Будет ли это создавать что-то полезное? Возможно нет. Если вы, возможно, не предоставили своим программам доступ в Интернет или какой-либо другой внешний API, к которым они могут случайно получить доступ, и, возможно, распространиться по Интернету.

К сожалению, у вашей описанной системы все еще есть несколько искусственных критериев воспроизведения: возможность компиляции.

Поскольку способность компилировать = способность к воспроизведению, вы искусственно настраиваете свои программы на компиляцию.

Компилирование чего? Это не имеет значения, потому что любая программа, которая компилируется, как можно скорее воспроизводит как последнюю. Скажем, вы каким-то образом создали программу, которая выводит последовательность Фибоначчи. Или программа, которая могла бы победить шахматного гроссмейстера. Круто! К сожалению, он будет воспроизведен? Будет ли это особенным?

Совсем нет; он будет рассматриваться как "подходящий" для воспроизведения в качестве программы print('k')

Я предлагаю, возможно, создать структуру случайных строк программ, имеющих доступ к API, которые могут:

  • Чтение/запись на жесткий диск, и внезапно у вас есть программы, которые сами могут записывать случайные строки как программы.
  • Удалить/изменить другие файлы на жестком диске; это позволяет, возможно, программам конкурировать друг с другом. Ваш API может быть сконструирован таким образом, чтобы файл мог быть удален только в том случае, если "сила" (произвольное значение... возможно, длина символа) программы сильнее файла.
  • Запустите другие скрипты на жестком диске... возможно даже те, которые они пишут
  • Доступ в Интернет; на веб-сервер? Возможность писать/прикреплять/отправлять/читать электронные письма?

Я думаю, что программа, которая пишет программы, которые могут воспроизводить себя, может дать лучшие результаты, чем программа, которая записывает программы, которые могут компилироваться.

Если вы не хотите только последнего; то, возможно, вы могли бы максимизировать длину программы. Но возможно ли что-то интересное? Не так много; любая программа, которая "компилирует" с определенной длиной, будет так же вероятна, как "воспроизведение".

Ответ 3

Другим проектом, который вы можете сделать, является работа над чем-то, что мутирует от не пропускания определенного unit test к передаче unit test.

Например, с учетом реализации

def add(a,b)
  a
end

Вы можете добавить тест

assert_equal 3, Foo.new.add(1,2)

и попросите свою программу попробовать любую комбинацию методов на a внутри add (например, a.-(b), a.to_s, a.+(b)), пока один из мутантов не пройдет этот тест и существующие тесты.

Возможно, вы захотите посмотреть на heckle (или Zentest?) для примеров смены тестируемого кода.

Ответ 5

Что было бы оптимальным - это программа который постоянно переписывает и улучшает поэтому мне не нужно

Выполните следующие действия:

  • Запись генератора псевдослучайных чисел в сборке. (реальный режим)
  • Измените программу, чтобы она выписывала (например) 64k случайных чисел и делает FAR JMP для первого байта.
  • (необязательно) Создайте драйвер для таймера сторожевой собаки для предотвращения бесконечных циклов.
  • Загрузите загрузочный сектор какого-либо устройства.
  • Получить несколько компьютеров. Настройте так, чтобы при тройной ошибке они перезагрузились и загрузились с загрузочного сектора вашего устройства.
  • Загрузите компьютеры и подождите несколько десятилетий (или столетий, что угодно) для того, чтобы создать что-то полезное.
  • Profit!

Ответ 6

Ранними, но очень интересными работами в этом направлении был Дуг Ленат "AM" (Математик) и Eurisko (обобщение AM).

Eurisko разработала набор hueristics, изучив, как граничные условия повлияли на решение проблемы. Он не генерировал нежелательной информации, а затем пытался ее использовать, скорее, он принял слабый метод решения проблем и обнаружил случаи, когда он мог бы значительно улучшить работу, и выпустил исправленную версию решателя проблем.