자신의 소스 코드에 대한 프로그램 추론


15

이 질문에 대한 영감은 다음과 같은 모호한 질문입니다. 자체 소스 코드에 대해 추론하고 수정할 수있는 AI를 갖기위한 프로그래밍 언어 / 논리적 기초는 무엇입니까?

이것은 전혀 엄격하지 않으므로 여기에서 구체적인 질문을 추출하려는 시도가 있습니다. 관심있는 두 가지가 있습니다.

(A) 자체 프로그램을 데이터 유형 프로그램 (예 : AST)으로 표현하고 조작 할 수있는 프로그래밍 언어 P. 원하는 경우 Program 유형의 객체를 해당 언어로 된 유효한 프로그램의 텍스트 인 String으로 변환 할 수 있습니다. 이는 컴파일러와 반대입니다.

(B) 언어 P의 프로그램이 무엇을하는지 추론하는 방법. 내가 생각하는 두 가지 수준은 다음과 같습니다.

  1. P- 프로그램의 기능을 모델링하는 다른 언어 Q (정리 증명 기능 포함) "프로그램 p 실행 결과는 foo"와 같은 문구를 표현하고 증명할 수 있어야합니다.
  2. 프로그램 p : Program이 언어 P 자체에서 수행하는 작업 을 추론하는 방법 . (따라서 우리는 P = Q 이상을 취합니다.)

이와 같은 것이 어느 정도까지 구현되었거나이 방향으로 어떤 진전이 있습니까? 실질적인 장애는 무엇입니까? 질문의 원래 의도에 비추어 문제를 공식화하는 가장 좋은 방법은 무엇입니까?

*

답이 보여 주듯이 (감사합니다!), (A)와 (B1)은 별도로 할 수 있지만, 함께하는 것이 더 연구적인 문제인 것 같습니다.

다음은 질문에 대한 나의 첫 생각 중 일부였습니다 (경고 : 오히려 모호함). Martin Berger의 답변에 대한 의견도 참조하십시오.

더 간단한 프로그래밍 언어가 아닌 동일한 프로그래밍 언어를 모델링하는 프로그래밍 언어에 관심이 있습니다 (따라서 위의 P = Q). 이것은 "자신의 소스 코드에 대해 추론 할 수있는"프로그램의 "개념 증명"입니다. 의존적으로 타이핑 된 프로그래밍 언어는 함수의 출력에 대해 보장 할 수 있지만 "Hello world!"이상으로 "자체 소스 코드에 대한 추론"으로 간주되지는 않습니다. 나체 문자열을 자동으로 인쇄하는 언어에서 퀴인으로 간주됩니다. 어떤 종류의 인용 / 자체 참조가 필요합니다. 여기의 아날로그에는 프로그램을 나타내는 데이터 유형이 있습니다.

다소 큰 프로젝트 인 것 같습니다. 언어가 단순할수록 모든 것을 표현하기가 더 어려워집니다. 언어가 복잡할수록 언어를 모델링하기 위해 더 많은 작업을 수행해야합니다.

재귀 정리의 정신에 따라 프로그램은 자체 소스 코드를 "가져 와서"수정할 수 있습니다 (즉, 수정 된 버전 자체 출력). (B2)는 프로그램 이 수정 된 프로그램에 대한 보증을 표현할 수 있어야한다고 알려줍니다 (이것은 재귀 할 수 있어야합니다. 즉, 모든 향후 수정에 대해 무언가를 표현할 수 있어야합니까?).


1
"프로그램 p 실행 결과가 foo"라는 이론을 증명하기 위해 언어가 필요한 이유는 무엇입니까? 언어는 단순히 p를 실행할 수 있습니다! 실제로, 그것은 일어나고있는 일입니다.
Martin Berger


3
통역사를 구현할 수있는 모든 언어는 원칙적으로 필요한 작업을 수행 할 수 있습니다. 보다 수학적으로, 재귀 정리는 충분히 강력한 계산 모델을 유지합니다. 일부 프로그래밍 언어는 내장되어있어 쉽게 만들 수 있습니다. 추론과 동일 :이 언어 내에서 추론 시스템을 구현할 수 있습니다. 물론 프로그램의 정지 문제와 같은 모든 것을 추론 할 수는 없습니다.
Kaveh

2
나는 그 질문이 명확하지 않다고 생각한다. Python, Java 및 Martin의 답변에서 Martin이 언급 한 언어와 같은 프로그래밍 언어를 살펴보고 질문을 명확히하여 원하는 것을 충족하는지 또는 그렇지 않은지를 명확하게해야합니다.
Kaveh

1
@HoldenLee "P = Q"와 관련하여, 확립 된 용어는 "균질 메타 프로그래밍"이며, 이는 P Q 인 "이종 메타 프로그래밍"과 반대된다 .
Martin Berger

답변:


14

두 가지 다른 점을 묻는 것 같습니다.

  • 프로그래밍 언어가 모든 프로그램을 데이터로 표현할 수있는 능력.
  • 프로그램을 데이터로 추론.

분석 목적으로 그것들을 분리하는 것이 유용합니다. 나는 전자에 집중할 것이다.

데이터가 메타 프로그래밍 또는 호모 닉 과 같은 용어에 따라 프로그램을 표현, 조작 (및 실행) 할 수있는 프로그래밍 언어의 능력 .

(어색한) 모든 잘 알려진 프로그래밍 언어는 문자열에 외부 프로그램 (컴파일러, 링커 등)을 호출하는 기능과 함께 문자열 데이터 유형을 사용하여 메타 프로그래밍을 수행 할 수 있습니다 (예 : 파일에 파일을 작성) 시스템 우선). 그러나 그것은 아마도 당신이 의미하는 것이 아닙니다. 아마도 좋은 구문을 염두에두고있을 것입니다. 거의 모든 문자열이 프로그램을 나타내지 않기 때문에 문자열은 프로그램 표현을위한 좋은 구문이 아닙니다. 즉, 문자열 표현 데이터 형식은 프로그램 표현 메커니즘으로 볼 때 많은 '정크'를 포함합니다. 설상가상으로, 문자열 연산의 대수는 본질적으로 프로그램 구성의 대수와 관련이 없습니다.

아마 당신이 생각하는 것은 훨씬 더 좋은 것입니다. 예를 들어, 가 프로그램 인 경우 는 이지만 조작 및 분석을위한 데이터입니다. 이것을 종종 인용 이라고 합니다. 실제로 인용은 융통성이 없기 때문에 우리 는 대신 인용 부호를 사용합니다. 이것은 인용 부호에 '구멍'을 가질 수있는 프로그램을 실행할 수있는 '구멍'이있을 수있는 인용의 일반화입니다. 예를 들어 는 조건 대신 구멍이있는 조건을 나타내는 준 인용 부호입니다.P I F[ ] M X > 0 I F

나는에프[]h이자형7이자형에스이자형8+9
[] . 프로그램 이 데이터 되면, 인용 부호 는 데이터미디엄엑스>0I F
나는에프[미디엄]h이자형7이자형에스이자형8+9
나는에프엑스>0h이자형7이자형에스이자형8+9.

( 은 인용 된 프로그램, 즉 데이터를 프로그램으로 반환하는 일반 프로그램 (데이터가 아닌 프로그램)입니다.)이 작업을 수행하려면 프로그램을 나타내는 데이터 유형이 필요합니다. 일반적으로 해당 데이터 유형을 AST (추상 구문 트리)라고하며 AST의 약어 메커니즘으로 (준수)를 볼 수 있습니다.미디엄

몇몇 프로그래밍 언어는 준 따옴표와 메타 프로그래밍을위한 다른 기능을 제공합니다. 프로그램을 데이터로 취급하는이 기능을 개척 한 것은 매크로 기능을 갖춘 Lisp입니다. 불행히도 Lisp 기반 매크로의 힘은 Lisp의 최소한의 구문에 크게 영향을 미쳤습니다. MetaML (1)이 되어서야 현대적이고 문법적으로 풍부한 언어가 메타 프로그래밍이 가능한 것으로 나타났습니다. 그 이후로 MetaOCaml (2) (MetaML의 자손으로, 프로그램을 데이터로 입력하는 방법의 문제를 해결하기 위해 계속 진행중인 퀘스트에서 획기적인 발전을 위해 중요 함), Template Haskell (3) 및 Converge (4) (첫 번째 언어) 필자의 의견으로는 모든 주요 메타 프로그래밍 기능을 얻을 수 있음)은 다양한 현대 프로그래밍 언어가 메타 프로그래밍을 수용 할 수 있음을 보여주었습니다. 우리가 취할 수 있다는 것을 아는 것이 중요합니다어떤 프로그래밍 언어 과 메타 프로그래밍 언어로 돌려 이다 데이터로 자신의 프로그램을 대표하는 (및 평가)의 기능과 함께.미디엄

데이터로 제공된 프로그램 실행 결과를 나타내는 것은 프로그램 (데이터로 제공됨)을 입력으로 받아서 실행 하는 함수를 추가하여 달성 됩니다. 결과를 반환합니다. 예 :이 경우 17과 평가 프로그램입니다 의 (준) 인용 버전 즉, 데이터로, 다음 도 17은 모든 종류가있다 반환 내가 질문을 여기에 같은 무시하고있어 것을 여기에 미묘한 이자형V()이자형V()메타 프로그래밍 된 프로그램이 평가되고 있습니다 (컴파일 타임과 런타임 메타 프로그래밍의 차이를 일으킴). 유형과 관련된 작업 또는 평가 실패, 에서 진행되는 과정에서 변수를 바인딩하고 해제하는 작업 또는 그 반대.

두 번째 차원에 관해서는 데이터로 주어진 프로그램에 대한 추론. 프로그램을 데이터로 변환 할 수있게되면 프로그램은 '정상적인'데이터이며 데이터로 추론 될 수 있습니다. Joshua가 지적한 것처럼 모든 유형의 검증 기술 (예 : 종속 유형 또는 계약 또는 대화식 정리 프로 버 또는 자동화 된 도구)을 사용할 수 있습니다. 그러나 추론 과정에서 언어의 의미론을 나타내야합니다. 만약 당신이 필요로하는 언어가 메타-프로그래밍 능력을 가지고 있다면, 상황이 조금 까다로워 질 수 있고,이 방향으로 많은 작업이 이루어지지 않았으며, (5)이 목적을위한 유일한 프로그램 논리입니다. 메타 프로그래밍에 대한 추론에 대한 Curry-Howard 기반 작업도 있습니다 (6, 7, 8). 이러한 논리 기반 접근 방식은 그리고 타입-기반 접근법 (2)은 미래의 모든 메타 프로그래밍 단계를위한 속성을 실제로 표현할 수있다. (2)를 제외하고는 그러한 논문 중 어느 것도 시행되지 않았다.

요약하면 : 당신이 요청한 것은 구현되었지만 꽤 미묘하며, 특히 유형 및 간소화 된 추론과 관련하여 여전히 공개적인 질문이 있습니다.


  1. 타하 다단계 프로그래밍 : 이론 및 응용 프로그램 .

  2. W. Taha와 MF Nielsen. 환경 분류기 .

  3. T. Sheard와 S. Peyton Jones. Haskell을위한 템플릿 메타 프로그래밍 .

  4. L. Tratt. 동적으로 형식화 된 OO 언어로 컴파일 타임 메타 프로그래밍 .

  5. M. Berger, L. Tratt, 동종 메타 프로그래밍을위한 프로그램 로직 .

  6. R. Davies, F. Pfenning, 단계별 계산의 모달 분석 .

  7. R. Davies, 바인딩 시간 분석에 대한 시간적 논리 접근법 .

  8. T. Tsukada, A. Igarashi. 환경 분류기의 논리적 기반 .


당신이 옳습니다-프로그래밍 언어 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입니다.
Holden Lee

(이의 공상 과학 판은 우리가 "자신을 계속 수정하는 프로그램이 핵 미사일을 발사하는 버튼을 누르지 않거나 프로그램이 항상 특정 수량을 최적화 할 것"이라는 "증거"를 가지고 있다는 것입니다.
Holden Lee

그렇기 때문에 프로그램 실행과 프로그램 출력 결과에 대한 추론을 구분하고 싶었습니다. 실행하기 전에 실행 전에 수행 할 작업의 속성을 알고 싶습니다. A_n이 "소스 코드를 수정하여"A_ {n + 1}을 생성 할 수있게하려면 P에 반드시 메타 프로그래밍 기능이 있어야합니다 (이로 인해 (5)의 위치에 놓임).
Holden Lee

여전히 P = Q에 흥미로울 것 같습니다. 가설 적으로 A는 AI 프로그램이며 자체 수정하는 방식은 자체 코드에 대한 추론을 통해 이루어집니다. 예를 들어 코드 비트에 대한 이론을 기록하고 증명 한 다음 코드 만 수정하면됩니다. 그렇다면 P는 Q의 능력을 가져야 할 것 같습니다.
Holden Lee

@HoldenLee A_n과 같은 프로그램을 작성할 수 있습니다. 문자열을 프로그램의 대표로 사용하는 경우, 모든 언어로 사소하게 수행 할 수 있습니다. 유사 인용 부호 나 이와 유사한 것을 원하면 수렴과 같이 가능합니다. 건설에서 m_n의 역할을 이해하지 못합니다.
마틴 버거

6

시스템에 네 단계를 모두 수행하는 현재 시스템이 없습니다. 시스템을 설계하려는 경우 첫 번째 요구 사항 중 하나는 단일 언어입니다. 최소한 당신은 시스템에 들어가서 스스로 해석하기 시작할 때 가능한 한 작은 핵심 프로그래밍 언어를 원할 것입니다. 그러므로 당신은 lisp에서 개척 된 metacircular 인터프리터를 원합니다. 다른 언어들도 그렇게했지만 lisp에 대한 엄청난 양의 기존 연구가 있습니다.

이 작업을 수행하려면 첫 번째 단계는 Lisp 또는 동종 언어를 사용하여 실행중인 프로그램에 대해 추론 할 수있는 것입니다. Lisp는 언어로 metacircular 인터프리터를 정의하거나 코드를 데이터로 취급 할 수있는 유일한 이유로 사용됩니다. 코드를 데이터로 취급하는 것이 가장 중요합니다. c2 위키에서 homoiconic이 무엇을 의미하는지에 대한 토론이 있습니다.

예를 들어 Lisp에서 "Program"데이터 유형은 유효한 lisp 프로그램입니다. lisp 프로그램을 통역사에게 전달하면 무언가를 계산합니다. 유효한 "프로그램"을 프로그래밍하지 않으면 인터프리터가 거부합니다.

따라서 호모 닉 언어는 세 가지 요구 사항을 수행합니다. 공식적인 프로그램의 아이디어를 이해하는데도 도움이됩니다.

리스프 내부에 리스프를 모델링 할 수 있습니까? 그렇습니다. 이것은 주로 리스프 프로그래밍 책 끝에서 실력을 테스트하기위한 연습으로 주로 수행됩니다. SICP

현재 문제 4는 연구 질문이며 아래는이 질문에 대한 답변을 시도한 것입니다.

나는 이것을 시도하는 많은 유형의 프로그램이 있다고 말할 것이다. 아래는 내가 아는 모든 프로그램입니다.

  • JSLint 는 기계 코드 또는 다른 언어를 사용하고 버그를 명시 적으로 찾는 정적 분석기의 예입니다. 그런 다음 프로그래머에게이를 수정하도록 요청합니다.

  • Coq 는 프로그래밍 언어를 사용하여 증명을 지정할 수있는 환경입니다. 또한 문제 해결 방법을 제안하는 전술도 있습니다. 여전히 이것은 인간이 일을하기를 기대합니다. Coq는 종속 유형을 사용하여 작동하므로 매우 유형 이론적입니다. 컴퓨터 과학자와 Homotopy Type Theory에서 일하는 사람들 사이에서 매우 인기가 있습니다.

  • 반면에 ACL2 는 자동 정리 증명 자입니다. 이 시스템은 사용자가 프로그래밍 한 것을 기반으로 진술을 증명합니다.

  • ACL2 및 Coq에는 시스템을 기계 학습 시스템 과 인터페이스하는 소프트웨어 플러그인이 있습니다 . 이러한 시스템을 훈련시키는 데 사용되는 것은 이전에 작성된 프로그램입니다. 내가 이해 한 바에 따르면 이러한 시스템은 전술뿐만 아니라 증거 개발에 도움이되는 이론을 제안하는 또 다른 기능을 추가합니다.

아래는 귀하의 질문이 의미하는 바에 대한 기초입니다.

  • gcc 는 최적화 된 컴파일러의 예이며, 입력으로 사용하고 최적화 된 버전을 출력 할 수 있습니다. 프로그램을 한 표현에서 다른 표현으로 변환하고 일부 최적화 플래그로 인해 속도를 향상시키는 컴파일러의 아이디어는 매우 잘 알려져 있습니다. 컴파일러를 부트 스트랩하고 유효한 기계 코드를 생성하면 최적화를 추가하고 컴파일러를 다시 컴파일하면보다 효율적인 자체 버전을 만들 수 있습니다.

1
언어를 가능한 최소한으로 만들 필요는 없습니다. 모든 메타에 관련 메타 프로그래밍 기능을 추가 할 수 있습니다. Taha의 MetaML 연구는 이것을 보여 주었다. 실제로 메타 프로그래밍 기능의 추가는 기계적인 것입니다.
Martin Berger

1
또한 "4 단계를 모두 수행하는 현재 시스템이 없음"에 동의하지 않습니다. 질문 4는 코드로 주어진 프로그램 실행에 대해서만 이야기합니다. Javascript의 평가조차도 완벽하게 가능합니다.
Martin Berger

@MartinBerger 내가 의미하는 바는 핵심 커널을 가능한 최소한으로 만드는 것이다. 또한 당신의 시스템이 # 4를하기를 희망하기 시작한다면 인간뿐만 아니라 컴퓨터가 사용할 수있는 훈련을 할 수있는 시스템을 원할 것입니다. 메타 프로그래밍 템플릿과 같은 시스템
Joshua Herman

그것은 우리가 무엇을 말하고 있는지에 달려 있습니다. 원래 질문에는 두 가지 정교함이 포함되어 있습니다. 첫 번째는 사소한 일이므로 프로그램을 실행하면됩니다. 두 번째 것은 타이핑 시스템 (2)에 대한 답변에서 (5)로 인용 된 논리로 처리 할 수 ​​있습니다. 나중은 MetaOCaml에서 구현됩니다. 그러나 (2)와 (5)는 임의의 형태의 메타 프로그래밍을 다룰 수 없으며 (2)에 의해 보증되는 속성은 약간 약합니다 (결국 유형 유추를 가진 타이핑 시스템입니다) .
Martin Berger

1
"핵심 커널을 가능한 최소한으로 만드십시오"는 말이 아닙니다. 모든 언어에 메타 프로그래밍을 추가 할 수 있습니다.
Martin Berger

5

따라 @ user217281728의 대답은 전화보다 추론 및 인공 지능에 관련된 기계의 종류가 언급 괴델 기계가

Gödel 시스템은 Jürgen Schmidhuber가 발명 한 자체 개선 컴퓨터 프로그램으로 문제를 최적의 방식으로 해결합니다. 새로운 코드가보다 최적의 전략을 제공한다는 것을 증명할 수있을 때 자체 코드를 다시 작성하는 재귀적인 자체 개선 프로토콜을 사용합니다. 이 기계는 Jürgen Schmidhuber에 의해 발명되었지만 수학적 이론에 영감을 준 Kurt Gödel의 이름을 따서 명명되었습니다.

Jürgen Schmidhuber의 "Goedel Machines : 자기 참조 범용 문제 해결사로 최적의 자기 개선을 가능하게하는", (2006) arXiv : cs / 0309048v5

기계가 메타 학습 을 구현하는 방식 에는 두 단계가 있습니다.

  1. 데이터를 통한 학습 (수준 1, 학습)
  2. 학습 된 데이터를 사용하여 소스 코드 / 알고리즘을 수정 / 최적화 (레벨 2, 학습 배우기)

기계가 자체 소스를 수정하므로 자체 참조 적입니다. 즉 자체 수정 특성이 있습니다 ( 여기 참조 ).

이런 의미에서 학습 알고리즘 자체를 엄격한 의미로 수정할 수 있습니다 (최적의 자체 수정을 증명 함). 이 경우 자체 참조 및 결정 불가능성에 문제가 있습니다.

.. 무제한 계산 자원을 가진 고델 기계는 그 효과를 입증 할 수없는 자기 개선을 무시해야합니다

자체 수정 특성이있는 다른 언어 (및 연관된 인터프리터 기계)는 예를 들어 LISP 입니다.

LISP 코드와 데이터는 상호 교환 가능하거나 소스 코드 AST는 LISP 프로그램에서 데이터로 사용 가능하며 데이터로 수정할 수 있습니다. 반면에 일부 소스 코드의 경우 데이터는 AST로 볼 수 있습니다.

최신 정보

있습니다 기타 기계뿐만 아니라 같은 자체 프로그래밍 시스템 통합 (다른 사람의 사이에서) 자기 참조 , 자동 재생자동 프로그래밍 .

위의 흥미로운 점 중 하나는 자체 참조가 전혀 문제가되지 않고 자체 재생 / 자체 프로그래밍 오토마타에 필요한 요소 라는 것입니다 .

자세한 내용 및 추가 간행물은 JP Moulin, CR Biologies 329 (2006)를 참조하십시오.

요약

생활 시스템은 예측할 수없는 환경에 대한 적절한 대응을 할 수 있습니다. 이런 종류의 자체 조직은 자체 프로그래밍 기계, 즉 스스로 수정할 수있는 조직으로 작동하는 것 같습니다. 지금까지 제안 된 생명체의 자기 조직화 모델은 차동 시스템의 기능 솔루션 또는 오토마타의 전이 기능입니다. 이 기능은 고정되어 있으므로 모델을 구성 할 수 없습니다. 다른 한편으로, 컴퓨터 과학은 생물의 적응 시스템의 특성을 갖는 많은 모델을 제안하지만,이 모든 모델은 프로그래머의 목표와 결과와 독창적 인 매개 변수 선택 간의 비교에 의존하지만 프로그래머의 의도는 없습니다 생활 시스템의 선택도 아닙니다.미디엄에스미디엄에스


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.