Програма міркування про власний вихідний код


15

Натхненням для цього питання є наступне (розпливчасте) запитання: Які мови програмування / логічні основи наявності AI, який міг би міркувати про власний вихідний код та змінювати його?

Це зовсім не суворо, тому ось моя спроба витягнути з нього конкретне питання. Мене цікавлять дві речі:

(A) Мова програмування P, яка може представляти та маніпулювати власними програмами як Програма типу даних (наприклад, як AST). (За бажанням об'єкт типу Program може бути перетворений у String, що є текстом дійсної програми на цій мові. Це було б протилежним тому, що робить компілятор.)

(B) Метод міркування того, що робить програма мовою P. Ось два рівні я думаю про це:

  1. Інша мова Q (з можливостями доведення теореми), яка моделює те, що робить P-програма. Він повинен вміти висловлювати та доводити твердження на кшталт "результат запуску Програми".
  2. Спосіб міркувати про те, що програма p: Програма робить мовою P самою. (Отже, ми беремо P = Q вище.)

До якої міри реалізовано щось подібне чи який прогрес у цьому напрямку? Які практичні перешкоди? Зважаючи на вихідний намір питання, який найкращий спосіб формалізувати проблему?

*

Як показують відповіді (спасибі!), І (A), і (B1) можна зробити окремо, хоча, схоже, їх спільне використання - це більше питання дослідження.

Ось кілька моїх перших думок з цього питання (попередження: досить розпливчасте). Дивіться також мої коментарі до відповіді Мартіна Бергера.

Мене цікавить мова програмування, що моделює ту саму мову програмування, а не більш просту (тому P = Q вище). Це було б "доказом концепції" програми, здатної "міркувати про власний вихідний код". Залежно набрані мови програмування можуть давати гарантії щодо результатів його функцій, але це не вважається "міркуванням про власний вихідний код" більше, ніж "Привіт, світ!" вважається лайкою мовою, яка автоматично роздруковує голу рядок --- повинно бути якесь цитування / самонавіювання. Аналог тут має тип даних, що представляє Програму.

Це здається досить великим проектом - чим простіша мова, тим важче виразити все, що знаходиться всередині неї; чим складнішою є мова, тим більше роботи потрібно зробити для моделювання мови.

У дусі теореми рекурсії програма може потім "отримати" власний вихідний код і змінити його (тобто вивести модифіковану версію себе). (B2) потім повідомляє нам, що програма повинна бути в змозі висловити гарантію щодо модифікованої програми (це має бути в змозі повторити, тобто вона повинна бути в змозі висловити щось про всі майбутні модифікації??).


1
Навіщо вам потрібна мова, щоб виступати як доказ теореми, щоб встановити, що "результат запуску Програми p є foo"? Мова може просто запустити p! Дійсно, саме так і відбувається.
Мартін Бергер


3
Зауважте, що в принципі вся мова, яка може реалізувати для себе інтерпретатор, може робити те, що вам потрібно. Більш математичним способом теорема про рекурсію справедлива для будь-якої досить сильної моделі обчислення. Деякі мови програмування просто полегшують його вбудованим. Те саме для міркувань: ви можете впровадити будь-яку систему міркувань всередині цих мов. Звичайно, не можна сподіватися на те, що все можна пояснити, наприклад, проблема зупинки програм.
Каве

2
Я думаю, що питання не дуже зрозуміле. Ви повинні ознайомитись з мовами програмування, такими як Python, Java, та тими, які згадував Мартин у своїй відповіді, та уточнити питання, тож чи зрозуміло, що вони відповідають тому, що ви шукаєте, або якщо ні, то чому б ні.
Каве

1
@HoldenLee Щодо "P = Q", усталеною термінологією є "однорідне метапрограмування", яке протистоїть "неоднорідному метапрограмуванню", де P Q.
Мартін Бергер

Відповіді:


14

Я думаю, ви запитуєте про дві різні речі.

  • Здатність мови програмування представляти всі свої програми як дані.
  • Мислення про програми як дані.

В аналітичних цілях корисно тримати їх окремо. Я зупинюсь на першому.

Здатність мов програмування представляти, маніпулювати (і запускати) свої програми як дані переходить під такі терміни, як метапрограмування або гомоіконічність .

(Незручно) всім відомі мови програмування можуть робити метапрограмування, а саме, використовуючи тип рядкових даних разом із можливістю виклику зовнішніх програм (компілятор, лінкер тощо) на рядках (наприклад, записуючи їх у файл система спочатку). Однак це, мабуть, не так. Напевно у вас є гарний синтаксис. Рядки - це не симпатичний синтаксис для представлення програми, оскільки майже всі рядки не представляють програми, тобто тип рядкових даних містить багато "мотлоху", коли розглядається як механізм представлення програми. Що ще гірше, алгебра струнних операцій по суті не має зв'язку з алгеброю побудови програми.

Те, що ви, мабуть, маєте на увазі - це щось набагато приємніше. Наприклад , якщо є програмою, то P є , а також дані, під рукою для маніпулювання і аналізу. Це часто називають цитатою . На практиці котирування негнучкі, тому ми використовуємо квазіцитацію , яка є узагальненням котирування, де цитата може мати "дірки", в яких можна запускати програми, які надають дані для "заповнення" дірок. Наприклад, - квазі-цитата, що представляє собою умовну, де замість умови у нас є діркаППя еП[ ]

if[]тгоден7елсе8+9
[]. Якщо програма оцінює дані , то квазіцитата оцінює даніМх>0
if[М]тгоден7елсе8+9
ifх>0тгоден7елсе8+9.

(Зауважте, що - це звичайна програма (а не програма як дані), яка повертає програму, що цитується, тобто програму як дані.) Для того, щоб це працювало, для представлення програм вам потрібен тип даних. Зазвичай цей тип даних називається AST (абстрактне синтаксичне дерево), і ви можете бачити (квазі) лапки як механізми абревіатури для AST.М

Кілька мов програмування пропонують квазіцитати та інші функції метапрограмування. Саме Лісп з його функціональністю макросування вперто вніс цю здатність сприймати програми як дані. Можливо, на жаль, потужність макросів, заснованих на Ліппі, давно бачилася, що значною мірою спирається на мінімалістичний синтаксис Ліспа; Лише в MetaML (1) було показано, що сучасна синтаксично багата мова здатна до метапрограмування. Відтоді MetaOCaml (2) (нащадок MetaML, важливий для його прориву в досі триваючих пошуках вирішення проблеми, як вводити програми як дані), Шаблон Haskell (3) та Converge (4) (перша мова для отримати всі ключові функції метапрограмування, на мою думку) показали, що різноманітні сучасні мови програмування можуть містити метапрограмування. Важливо усвідомити, що ми можемо взятибудь-яку мову програмування та перетворити її на мову метапрограмування яка є разом із можливістю представлення (та оцінки) власних програм як даних.LLмpL

Представлення результату запущеної програми, поданої у вигляді даних, досягається додаванням функції яка приймає програму (дану як дані) як вхідну та запускає її , повертаючи свій результат. Наприклад, якщо - програма, що оцінює до 17 і , (квазі) котирується версія , тобто як дані, то також повертається 17. Є всі способи тонкощі тут, які я тут ігнорую, наприклад питання, колиеvал()ПР Р е V л ( Р ) Р Р ПППеvал(П)метапрограмовані програми оцінюються (спричиняючи різницю між мета-програмуванням часу компіляції та часу виконання), що робити з типами чи неспроможними оцінками, що відбувається з обмеженими та вільними змінними в процесі переходу від до або навпаки.ПП

Щодо другого аспекту, міркування про програми, що даються як дані. Як тільки ви можете перетворити програми в дані, вони є "нормальними" даними і можуть бути аргументовані як дані. Ви можете використовувати всі способи перевірки технологій, наприклад залежні типи чи контракти, інтерактивні докази теореми чи автоматизовані інструменти, як Джошуа зазначив. Однак вам доведеться представляти семантику вашої мови в процесі міркування. Якщо ця мова, як вам потрібно, має метапрограмування, все може стати дещо складним, і в цьому напрямку не було зроблено багато роботи, при цьому (5) є єдиною логікою програми для цієї мети. Існує також робота, що базується на Кері-Говарді над міркуванням про метапрограмування (6, 7, 8). Зауважте, що ці підходи, засновані на логіці, і підхід, заснований на типі (2), дійсно може виражати властивості, які існують для всіх майбутніх етапів метапрограмування. Крім (2) жодна з цих робіт не була виконана.

Підсумовуючи це: те, що ви просили, було реалізовано, але це досить тонко, і все ще є відкриті запитання, зокрема, що стосується типів та спрощених міркувань.


  1. В. Таха. Багатоетапне програмування: його теорія та застосування .

  2. В. Таха та М. Ф. Нільсен. Класифікатори навколишнього середовища .

  3. Т. Шеард і С. Пейтон Джонс. Метапрограмування шаблонів для Haskell .

  4. Л. Тратт. Скомпілювати метапрограмування за часом у динамічно набраній мові ОО .

  5. М. Бергер, Л. Тратт, Логіка програм для однорідного метапрограмування .

  6. Р. Девіс, Ф. Пфеннінг, Модальний аналіз поетапних обчислень .

  7. Р. Девіс, часово-логічний підхід до аналізу часових зв'язків .

  8. Т. Цукада, А. Ігараші. Логічна основа класифікаторів середовища .


Ви маєте рацію - мова програмування P може відрізнятися від мови Q, яка виражає теореми / докази щодо програм на цій мові (що може бути, наприклад, у Coq). Теорема, про яку я думаю, іде так: Припустимо, у нас ретельно розроблена програма A_1. Thm: Для кожного n виконується наступне: Програма A_n виведе (m_n, A_ {n + 1}), де m_n - ціле число, A_ {n + 1} - інша програма (наприклад, отримана, змінюючи A_n певним чином) , а для всіх n маємо, що m_n> 0.
Холден Лі

(Науково-фантастична версія цього полягає в тому, що у нас є "доказ", що програма, яка продовжує змінювати себе, ніколи не натисне кнопку, яка запускає ядерну ракету, скажімо, або що програма завжди оптимізує певну кількість.)
Холден Лі

Ось чому я хотів зробити різницю між запуском програми та міркуванням щодо того, що програма виведе - ми хочемо знати властивості того, що вона буде робити до запуску, не запускаючи її. Зауважте, що якщо ми хочемо, щоб A_n мав змогу "змінити свій вихідний код", щоб створити A_ {n + 1}, тоді P обов'язково матиме здатності до метапрограмування (що ставить нас у положення (5)).
Холден Лі

Мені все ж здається, що це було б цікаво для P = Q. Гіпотетично, A - це програма AI, і спосіб, який міг би змінити себе, - це міркування про власний код - наприклад, запишіть теореми про біти коду, доводячи їх, і лише потім змінюючи його код. Тоді, здається, P потрібно мати можливості Q.
Холден Лі

@HoldenLee Можна писати такі програми, як A_n. Якщо ви використовуєте рядки в якості представника програм, це можна зробити тривіально будь-якою мовою, якщо ви хочете квазіцитати або подібні, це можливо, наприклад, наприклад, конвертувати. Я не розумію ролі m_n у побудові.
Мартін Бергер

6

Ні, немає поточної системи, яка виконує всі чотири кроки у вашій системі. Якщо ви хочете спроектувати систему, однією з перших вимог є гомоніконічна мова. Як мінімум, ви хочете, щоб ваша основна мова програмування була якомога меншою, щоб, коли ви входите в систему і починали змушувати її інтерпретувати, вона буде працювати. Отже, ви хочете перекладача метациркуляції, який був першопрохідним у лісі. Інші мови також зробили це, але існує величезна кількість існуючих досліджень на просторі.

Перший крок, якщо ви хочете це зробити, - це мати гомоніконічну мову, наприклад, Lisp або якусь рамку, де ви можете міркувати про запущену програму. Для цього використовується Lisp з єдиної причини, що ви можете визначити інтерпретатор метациркуляції мовою або можете просто ставитися до коду як до даних. Розгляд коду як даних є найважливішим. Поруч обговорюється питання про те, що означає гомоніконізм у вікі c2.

Наприклад, в Lisp вашому типі даних "Program" є дійсні програми Lisp. Ви передаєте програми Lisp інтерпретатору, і він щось обчислює. Перекладач його відхиляє, якщо ви не запрограмуєте дійсну "Програму".

Тому гомонічна мова виконує три ваші вимоги. Ви навіть можете в lisp визначити ідею офіційної програми.

Чи можете ви моделювати lisp всередині lisp? Так, це часто робиться в основному як вправа в кінці книги програмування шпигуна, щоб перевірити свої здібності. SICP

На сьогоднішній день питання чотири - це дослідницьке питання, а нижче - те, що я виявив, що намагається відповісти на це питання.

Я б сказав, що існує багато типів програм, які намагаються це зробити. Нижче наведено всі програми, про які я знаю.

  • JSLint - це приклад статичних аналізаторів, які беруть машинний код або якусь іншу мову і явно шукають помилки. Потім він просить програміста виправити це.

  • Coq - середовище, яке дозволяє задавати докази за допомогою мови програмування. Він також має тактику, де він пропонує шляхи вирішення проблеми. І все-таки це очікує, що людина виконає цю роботу. Кок використовує залежні типи для роботи і тому дуже теоретичний тип. Він дуже популярний серед комп'ютерних вчених та людей, які працюють над теорією типу гомотопії.

  • ACL2, з іншого боку, є автоматизованим підтвердженням теореми. Ця система буде підтверджувати твердження, засновані на тому, що ви програмуєте.

  • ACL2 та Coq мають плагін програмного забезпечення, який поєднує їх систему з системою машинного навчання . Для підготовки цих систем використовуються раніше написані програми. З мого розуміння, ці системи додають ще одну особливість, де ви маєте не тільки свою тактику, але й запропоновані теореми, які допомагають у розробці доказів.

Нижче наведено основні відомості про те, що означає ваше запитання.

  • gcc - приклад компілятора optimizng, який може взяти себе за вхід, а потім вивести оптимізовану версію себе. Ідея компілятора, який переводить програми з одного представлення в інше та покращує швидкість завдяки деякому прапору оптимізації, дуже добре зрозумілий. Після завантаження компілятора, і він генерує дійсний код машини, ви можете додати оптимізацію та перекомпілювати компілятор, і це робить більш ефективну версію себе.

1
Не потрібно робити мову якомога меншою. Ви можете додати відповідні функції метапрограмування на будь-яку мову. Програма MetaML Taha показала це. Насправді доповнення можливостей метапрограмування є механічним.
Мартін Бергер

1
Я також не погоджуюся з тим, що "не існує діючої системи, яка б робила всі чотири кроки". Питання 4 говорить лише про запущені програми, надані як код. Це абсолютно можливо, адже навіть Javal eval це робить.
Мартін Бергер

@MartinBerger, що я маю на увазі, це зробити ядро ​​ядра якомога мінімальним. Крім того, якщо ви навіть почнете хотіти сподіватися, що ваша система зробить номер 4, вам потрібна система, яка зможе навчити не просто людей, а й комп'ютери, щоб користуватися таким чином, було б корисно мати мінімальну систему, і вони мають бібліотеки, кодовані в ця система на зразок шаблону мета програмування
Джошуа Герман

Це залежить від того, про що (4) ми говоримо. Оригінальне запитання містить дві уточнення з них. Перший тривіальний, ви просто запускаєте програму. Другий може вирішуватися логікою, яку я цитував (5) у своїй відповіді щодо системи набору тексту (2). Пізніше реалізовано в MetaOCaml. Але є можливість для додаткових досліджень: ні (2), ні (5) не можуть мати справу з довільними формами метапрограмування, а властивості, гарантовані (2), трохи слабкі (зрештою, це система набору тексту з висновком типу) .
Мартін Бергер

1
Щодо "ви робите основне ядро ​​якомога менше": це не потрібно. Ви можете додати повне метапрограмування на будь-яку мову.
Мартін Бергер

5

Як згадується у відповіді @ user217281728, існує тип машин, пов'язаних більше з висновками та AI, звані Gödel Machines

Машина Геделя - це вдосконалювана комп'ютерна програма, винайдена Юргеном Шмідхубером, яка оптимально вирішує проблеми. Він використовує рекурсивний протокол самовдосконалення, в якому він переписує власний код, коли може довести, що новий код забезпечує більш оптимальну стратегію. Машина була винайдена Юргеном Шмідхубером, але названа на честь Курта Геделя, який надихнув математичні теорії.

Посилана публікація Юргена Шмідхубера на тему "Машини Геделя: Автореференційні універсальні вирішувачі проблем, які роблять виразно оптимальні самовдосконалення", (2006) arXiv: cs / 0309048v5

Спосіб роботи машини для впровадження мета-навчання має дві фази:

  1. Навчання за допомогою даних (рівень 1, вчитися)
  2. Використання вивчених даних для зміни / оптимізації його вихідного коду / алгоритму (рівень 2, навчитися вчитися)

Оскільки машина модифікує власне джерело, воно є самореференційним, тобто має властивість самовиправлення (див. Також тут ).

У цьому сенсі він може змінювати сам алгоритм навчання в суворому сенсі (доводячи оптимальні самомодифікації). Існують проблеми із самонаправленням та невизначеністю, які в цьому випадку мають форму:

..a машина Gödel з необмеженими обчислювальними ресурсами повинна ігнорувати ті самовдосконалення, ефективність яких вона не може довести

Наприклад, інші мови (та пов'язані з ними перекладачі), які мають властивість самомодифікуватися, наприклад LISP .

У LISP-коді і дані є взаємозамінними, або вихідний код AST доступний у вигляді даних у програмі LISP і може бути змінений як дані. З іншого боку, для деяких вихідних кодів дані можна розглядати як AST.

оновлення

Є й інші машини , як машини для самопрограмування (серед інших), які поєднують в собі самонаправлення , самовідтворення та самопрограмування. .

Одним із цікавих аспектів сказаного є те, що самонавіювання зовсім не є проблематичним , скоріше, це необхідний елемент самовідтворення. / самопрограмування .

Більш детальну інформацію (та більше публікацій) див. У JP Moulin, CR Biologies 329 (2006)

реферат

Живі системи здатні мати відповідні реакції на непередбачуване середовище. Цей вид самоорганізації, здається, функціонує як машина самопрограмування, тобто орган, здатний змінювати себе. До цих пір запропонованими моделями самоорганізації живих істот є рішення функцій диференціальних систем або перехідні функції автоматів. Ці функції є фіксованими, і ці моделі не можуть змінювати свою організацію. З іншого боку, інформатика пропонує багато моделей, що мають властивості адаптивних систем живих істот, але всі ці моделі залежать від порівняння мети та результатів та геніального вибору параметрів програмістами, тоді як наміру програміста немає. ні вибір у живих системах.мсpМсp


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.