매카시 91 함수

McCarthy 91 function

매카시 91 함수는 컴퓨터 과학자 존 매카시가 컴퓨터 과학 내에서 공식적인 검증을 위한 시험 사례로 정의한 재귀 함수다.

매카시 91 함수는 다음과 같이 정의된다.

함수 평가 결과는 모든 정수 인수 n ≤ 100에 대해 M(n) = 91로, n > 100에 대해서는 M(n) = n - 10으로 주어진다. 실제로 M(101)의 결과도 91(101 - 10 = 91)이다. n = 101 이후 M(n)의 모든 결과는 지속적으로 1씩 증가하고 있다. 예: M(102) = 92, M(103) = 93.

역사

91 기능은 조하르 마나, 아미르 페누엘리, 존 매카시가 1970년에 발표한 논문에서 소개되었다. 이 논문들은 프로그램 검증을 위한 공식적인 방법의 적용을 향한 초기 개발을 나타낸다. 91 함수는 내포-재귀성을 위해 선택되었다((n){\ fn)}을(를 f ( 1 {\ )를 사용하여 한 것과 같은 단일 재귀와 대비된다). 그 예는 마나의 저서 《수학적 계산 이론》(1974년)에 의해 대중화되었다. 형식 방법의 분야가 발전함에 따라, 이 예는 연구 문헌에 반복적으로 나타났다. 특히 자동화된 프로그램 검증을 위한 '도전 문제'로 평가된다.

꼬리-재귀 제어 흐름은 쉽게 이해할 수 있으며, 이는 등가(확장적으로 동일) 정의로 다음과 같다.

그러한 추리를 입증하기 위해 사용된 예들 중 하나로, 마나의 책에는 내포-재발 91 함수에 해당하는 꼬리-재발 알고리즘이 포함되어 있다. 91 함수의 "자동 검증"(또는 종료 증명)을 보고하는 논문의 상당수는 꼬리 회수 버전만 취급한다.

이는 상호 꼬리-재귀적 정의와 동일하다.

내포된 재귀 버전에서 상호 꼬리-재귀 버전을 공식적으로 파생한 것은 1980년 미첼 완드의 기사에서 계속의 사용에 기초하여 제공되었다.

예

예 A:

M(99) = 99㎛ 100 = M(110) 이후 M(100) 110 > 100 = 100 = M(111) 이후 111 > 100 = M(101) 이후 111 > 100 = 91 이후 101 > 100 이후의 M(1101) 

예 B:

M(87) = M(M(98))       = M(M(M(109)))       = M(M(99))       = M(M(M(110)))       = M(M(100))       = M(M(M(111)))       = M(M(101))       = M(91)       = M(M(102))       = M(92)       = M(M(103))       = M(93)    .... 패턴은 M(99), M(100), M(101)까지 계속 증가하는데, 우리가 사례 A에서 본 것과 정확히 같다) = 111 > 100 = 91 이후부터 M(101)까지 계속 증가한다. 

코드

다음은 Lisp에서 중첩-재귀 알고리즘의 구현이다.

(반기를 들다 mc91 (n)   (묵상하다 ((<= n 100) (mc91 (mc91 (+ n 11))))         (t (- n 10)))) 

다음은 Haskell에서 중첩-재귀 알고리즘의 구현이다.

mc91 n      n > 100   = n - 10     그렇지 않으면 = mc91 $ mc91 $ n + 11 

다음은 OCaml에서 중첩-재귀 알고리즘의 구현이다.

하게 하다 읊다 mc91 n =   만일 n > 100 그때 n - 10   다른 mc91 (mc91 (n + 11)) 

다음은 OCaml에서 꼬리 회수 알고리즘의 구현이다.

하게 하다 mc91 n =   하게 하다 읊다 보조를 맞추다 n c =     만일 c = 0 그때 n     다른 만일 n > 100 그때 보조를 맞추다 (n - 10) (c - 1)     다른 보조를 맞추다 (n + 11) (c + 1)   에   보조를 맞추다 n 1 

다음은 Python에서 중첩-재귀 알고리즘의 구현이다.

반항하다 mc91(n: 인트로) -> 인트로:     """맥카시 91 함수."""     만일 n > 100:         돌아오다 n - 10     다른:         돌아오다 mc91(mc91(n + 11)) 

다음은 C:에서 중첩-재귀 알고리즘의 구현이다.

인트로 mc91(인트로 n) {     만일 (n > 100) {         돌아오다 n - 10;     } 다른 {         돌아오다 mc91(mc91(n + 11));     } } 

다음은 C:의 꼬리-재귀 알고리즘 구현이다.

인트로 mc91(인트로 n) {     돌아오다 mc91taux(n, 1); }  인트로 mc91taux(인트로 n, 인트로 c) {     만일 (c != 0) {         만일 (n > 100) {             돌아오다 mc91taux(n - 10, c - 1);         } 다른 {             돌아오다 mc91taux(n + 11, c + 1);         }     } 다른 {         돌아오다 n;     } } 

증명

라는 증거가 있다.

알고리즘은M {\ M을(를) 계산하는 데 동등한 비복구 알고리즘을 제공한다

n > 100의 경우, 의 정의로부터 평등이 따르며 n ≤ 100의 경우, 100의 강한 유도를 사용할 수 있다.

90 n n ≤ 100,

M(n) = M(M(n + 11), 정의 = M(n + 11 - 10), n + 11 > 100 = M(n + 1)이기 때문에 

그래서 M(n) = M(101) = 91 = 90 n n 100 100. 이것은 베이스 케이스로 사용할 수 있다.

유도단계의 경우 n ≤ 89로 하고 모든 n < i ≤ 100에 대해 M(i) = 91을 가정한다.

M(n) = M(M(n + 11), 정의 = M(91), 가설, n < n + 11 ≤ 100 = 91, 베이스 케이스에 의한 n < n + 11 ≤ 100 = 91.  

이는 음수 값을 포함한 모든 n ≤ 100에 대해 M(n) = 91을 증명한다.

크누스의 일반화

도널드 크누스는 91 함수를 일반화하여 추가 파라미터를 포함시켰다.[1] 존 코울스는 ACL2 정리 프로베른을 이용하여 크누스의 일반화된 기능이 총체적이라는 공식적인 증거를 개발했다.[2]

참조

  1. ^ Knuth, Donald E. (1991). "Textbook Examples of Recursion". Artificial Intelligence and Mathematical Theory of Computation: 207–229. arXiv:cs/9301113. Bibcode:1993cs........1113K. doi:10.1016/B978-0-12-450010-5.50018-9. ISBN 9780124500105.
  2. ^ Cowles, John (2013) [2000]. "Knuth's generalization of McCarthy's 91 function". In Kaufmann, M.; Manolios, P.; Strother Moore, J (eds.). Computer-Aided reasoning: ACL2 case studies. Kluwer Academic. pp. 283–299. ISBN 9781475731880.
  • Manna, Zohar; Pnueli, Amir (July 1970). "Formalization of Properties of Functional Programs". Journal of the ACM. 17 (3): 555–569. doi:10.1145/321592.321606.
  • Manna, Zohar; McCarthy, John (1970). "Properties of programs and partial function logic". Machine Intelligence. 5. OCLC 35422131.
  • Manna, Zohar (1974). Mathematical Theory of Computation (4th ed.). McGraw-Hill. ISBN 9780070399105.
  • Wand, Mitchell (January 1980). "Continuation-Based Program Transformation Strategies". Journal of the ACM. 27 (1): 164–180. doi:10.1145/322169.322183.