Czy ktoś kiedykolwiek napisał system (oprogramowanie lub szczegółowe wyjaśnienie na papierze z prostymi przykładami), który generuje programy komputerowe? Wprowadzam i tworzy program, który wyświetla liczby pierwsze mniejsze niż 10. P r i m e ( x ) jest po prostu zdefiniowany jako 1 < x ∧ ∄ A Profesorowie mówią, że mogą, ale nikt nie podaje rzeczywistych pełnych przykładów.
17
Odpowiedzi:
Jest to bardzo aktywny temat badawczy, bardzo obiecujący, chociaż pełna automatyzacja generowania programów prawdopodobnie ma wewnętrzne ograniczenia (ale czy ludzie są w ogóle lepsi?). Ale pomysł jest nadal bardzo przydatny w znacznym wspomaganiu tworzenia programów poprzez mechanizację wielu kroków i automatyczne sprawdzanie poprawności generowania programu.
Jest to silnie powiązane z wynikiem w logice, zwanej korespondencją Curry'ego-Howarda (lub izomorfizmem), która pokazuje, że programy komputerowe i dowody matematyczne są bardzo podobne.
Chodzi o to, że system weźmie specyfikację programu jako twierdzenie, które ma zostać udowodnione. W twoim przykładzie byłoby to coś w stylu (nieformalnie): „istnieje zbiór wszystkich liczb pierwszych mniejszych niż 10”.
Następnie spróbujesz udowodnić to twierdzenie, a istniejące systemy pomogą ci w przeprowadzeniu dowodu, automatyzacji niektórych części, być może całego dowodu i upewnieniu się, że nigdy nie popełnisz błędów.
Z tego dowodu można następnie wyodrębnić program, który faktycznie oblicza żądaną listę liczb pierwszych, która została pierwotnie określona.
W przeszłości opracowano kilka systemów w celu wyjaśnienia tych pomysłów. Jednym z bardziej znanych był LCF przez Robin Milner , który stworzył język ML do tego celu. Jednym z najbardziej zaawansowanych systemów jest Coq .
Istnieją przykłady w pełni opracowane, niektóre z nich dość złożone. Niektóre z nich można znaleźć w poniższym artykule , chociaż nie jest to w żaden sposób proste czytanie i wymaga zaawansowanej znajomości logiki.
źródło
Prosta odpowiedź: tak, ale w chwili pisania tego tekstu, w przypadku większości programów niebanalnych specyfikacje wydają się tak samo trudne do napisania i debugowania, jak programy.
Mówiąc poważniej, odpowiedź Babou jest dobra, ale ja również zasugeruję sprawdzenie obszaru typów zależnych. Jest dość dobra książka z użyciem Coq (pełne zastrzeżenie: napisane przez mojego przyjaciela), ale są też Epigram, Agda i Idris. Warto również sprawdzić Isabelle / HOL.
Wszystkie są oparte na rachunku konstrukcji. Jeśli chcesz poznać podstawy teoretyczne, spójrz na teorię typu Martina-Löfa. Wokół jest kilka świetnych prezentacji.
źródło
W tym miejscu generatory programów (tj. Systemy, które opisywały coś wysokiego poziomu w jakimś specjalnym języku) istniały na zawsze. Każdy kompilator jest jednym z nich, podobnie jak każdy z wielu generatorów parsera. W dawnych czasach popularne były systemy nazywane „językami trzeciej generacji”, które generowały (większość) kod typowej aplikacji biznesowej, biorąc pod uwagę ogólny opis i katalog dostępnych danych.
źródło
Programowanie logiczne i, bardziej ogólnie, programowanie deklaratywne przyjmuje za podstawę dokładnie to, co proponujesz: mianowicie, ze specyfikacji logicznej, zwróć wynik spełniający tę specyfikację.
Jednym z obszarów, który wydaje się szczególnie dotyczyć podanego przykładu „liczb pierwszych mniejszych niż 10”, jest Programowanie Ograniczeń, które próbuje znaleźć rozwiązania problemów związanych z pewnymi ograniczeniami, w tym ograniczeniami całkowitymi, takimi jak te, które podałeś.
Możesz wypróbować ECLiPSe dla konkretnej implementacji takiego systemu (open source).
źródło