매카시 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.