Download - 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ
dgafe -Y)+ "5―1�)+(�&i―
���%
�bf`c\j2015��0 � ��!�Idgafe -Y)+,JZ�VLWj�('[�.[^YZj�*'h��iM�#��QWL]Rk�bf`cZ,_$MKUS��Z\j��[�/\�*'ZK_]R[XO��NTPLk
2016��0 �j���%dgafe -H�� 1
��[bf`cl:DDA544FFF2;=?3;CD3:@=E96;3683<A4G6B;>4AE74AB@B;B@?4
���������
n 1940s-1950s ��: ��� �����n 1960s: FORTRAN, LISP, ALGOL�PASCAL�n 1970s: C�n 1980s: C++, Objective C, SmallTalk n 1990s: Javan Perl, Python, Ruby, ... , Scala, Haskell
������ �� 4
��)��
��
n �1=fact&����:��;– /(�4#�"�%�$. "
n �2=– (1) 69587gcd(m,n)&(2)����:��;<��),&*%�$. "<
– (2) ���-��3��$�2"�*�14�:!+0 �!;
n ��=
n �*'���!1)�>
69587���� 5
��!��
n $� – ���� "5
– �����
– �� �� �2/(&'.03
– �4GCD2-1&/)+!���3
– �����
n ,%0*
– �� �!��# ���#
� f1��*-
n �&• ���(�� ��(�#���(�/�1�.�!%��&!%�"/�
• �(�)��(��(&�'(+�*.� 0-1��&!%&/��(�.�',$%��1����
n 1�@FG+$K�&:H
n �� B�J?6c
n '�– 31�U]NZV^N4(/��)(��,.") – Scala QO_ZT[U]NZV^N2#3�, Odersky�)aM^U\Qb
88B��`
�*) LISP, OCaml, python, scala?>A� !?1��*-<BdY_P_A��<�� E�7HeHaskell*-<BXSR=�CIH�%DK 6;�� A5H+$K��9d1��*-@�G0L<6Hee
U]NZW�.2�� 7
�����
n ��,����– ��,���+�����,��1��$'�– �
• ���n! = n * (n-1)! ��� 0! = 15! = 5 * 4!
= 5 * 4 * 3!= 5 * 4 * 3 * 2 != 5 * 4 * 3 * 2 * 1!= 5 * 4 * 3 * 2 * 1 * 0!= 5 * 4 * 3 * 2 * 1 * 1= 120
– ##+:�.�.��*$):��,��� a * b 1&,�8a*b,�9+%0�" !/�() 0
##-�7
36254����� 8
���� �
n ���!��� ��$�� "�����#
n C�����int fact(int n){
if (n == 0) {return 1;
} else {return n * fact(n-1);
}}
fact(n) = if n =0 then 1else n * fact(n-1)
��!��*
&)%('����� 9
����.���
n ����#��'5)1-/ ����6�00�%,!��-��'53",�*��60�'$+#��
n ����/�(&2��#��'5+/�4,!.*� #��– �<
• (-1)! = (-1) * (-2)!= (-1)* (-2) * (-3)!= …
8;7:9�� �� 10
� � �379�4�A��4��
n ��4�A1�4�/10�����4��;�-2$��
– ��n'��/#9-635"1;!(n78�*$�.4�4��m3�+.�8�:2$)0'��
n ��&1%&;�,9 � isPrime(n)– n'm78�*$1;!(��/�8�:9&1%&;�,9 �prime2(n,m);�
• ab�� ���������mod(a,b)���
isPrime(n) = prime2(n, n-1)prime2(n, m) = if m = 1 then true
else if mod(n, m) = 0 then falseelse prime2(n,m-1)
=@<?>��"�� 11
�����+����
n 2�#�������
n m £ sqrt(n)�"%�!$ ������
isPrime(n) = prime2(n, 2)prime2(n, m) = if m = n then true
else if mod(n, m) = 0 then falseelse prime2(n,m+1)
isPrime(n) = prime3(n, 2, sqrt(n))prime3(n, m, k) = if m > k then true
else if mod(n, m) = 0 then falseelse prime3(n,m+1)
�����
'*&)( �� 12
��
n ��;?+�>�)FT��<�R8E;�5/�S: 3�1D4;
��A�>��
5! = 5 * 4!= 5 * 4 * 3! = 20 * 3! = 20 * 3 * 2 ! = 60 * 2 != 60 * 2 * 1! = 120 * 1!= 120 * 1 * 0! = 120 * 1= 120
��>���?��
5! = 5 * 4!= 5 * 4 * 3!= 5 * 4 * 3 * 2 ! = 5 * 4 * 3 * 2 * 1!= 5 * 4 * 3 * 2 * 1 * 0!= 5 * 4 * 3 * 2 * 1 * 1= 120
* 3�1�!<%�FOKJGIR���S;@
* �&�;?T4E����:3</�>�F/0RUOKJGIF�9</�S
* �"=T6�=$�>4;<D��2.C�D
��S�'>��:?T��:�3�1BED�R,OKJGI-SF#7
44? �Q
LPHNM�(+�� 13
�����"��&�
n � ��-����– �� $��#����#�
– ��'���%"��!��
• ��������������������
• ������� �
• ������� ��
– ����������� ���
),(+*��� 14
84302*��(1)
n δ84302 :�+�+��;– � �(���&�*�+�.$
• �� �������� ���– ��4+9 ������ 13
– <,=('*�����&�*�+�.$
• �� ��������� �(true,false)– ��3>1 ������ true
n ��
– ��*��)��"-%!,��/��#%��
• �� ���� isPrime(n) = prime2(n, 2)isPrime(3)������prime2(3,2)
����
59176�� �� 15
#�������(2)
n ���– if a then b else c���������
• ��������a� �#���$ (true)�!�b$�(false)�!�c #�� ���
• ��%������$b�c���������"�• �%if true then 3 else 4#���"� 3
n � ����%and, not, or)– a and b
• if a then b else false– a or b
• if a then true else b– not a
• if a then false else true $�"! �� 16
�����
+,I�(
1) ��K– 7��K�?FJ9�N�I7�U��– /5f1*F<RNIJ�MH1*beager evaluationc– �=IY^V\Z_V03J��K
2) � �Kb�%�Kc– 7��K�?FJ9�N��I7�U��– /5f1*U6PBE1*b6�2�deager
evaluationce
>>J��a
Y^V\[&49�� 17
�.
n#�bcf>I�"FJd(1) ��K;d(2) � �K;H7TPAd ��I2�J-!I��OQN�H+,@RG,�@R
n�=IY^V\Z_V03Jd+,G?ELCG<J��KeCD?d� �KJdWX]`[1*b$8I1*c)FO=':PSRe
��������
n ���fact(n) = if n =0 then 1 else n * fact(n-1)n fact(3) = if 3 = 0 then 1 else 3 * fact(3-1)
= 3 * fact(3-1)= 3 * fact(2)= 3 * (if 2 = 0 then 1 else 2 * fact(2-1))= 3 * (2 * fact(2-1))= 3 * (2 * fact(1))= 3 * (2 * (if 1=0 then 1 else 1 * fact(1-1)))= 3 * (2 * (1 * fact(1-1)))= 3 * (2 * (1 * fact(0)))= 3 * (2 * (1 * (if 0 = 0 then 1 else 0 * fact(0-1))))= 3 * (2 * (1 * 1))= 3 * (2 * 1)= 3 * 2= 6
������
����� ��� 18
��,����)����*
fact(3) = if 3 = 0 then 1 else 3 * fact(3-1)= 3 * fact(3-1)= 3 * (if 3-1 = 0 then 1 else (3-1) * fact((3-1)-1)) = 3 * (if 2 = 0 then 1 else (3-1) * fact((3-1)-1))= 3 * ((3-1) * fact((3-1)-1)) …)��+���*
���fact(3)����" ���!�(
def fact(n) = if n=0 then 1 else n * fact(n-1)
$'#&% ��� 19
� ���������
fact(3) = if 3 = 0 then 1 else 3 * fact(3-1)= 3 * fact(3-1)= 3 * (if 3-1 = 0 then 1 else (3-1) * fact((3-1)-1)) = 3 * (if 2 = 0 then 1 else (3-1) * fact((3-1)-1))= 3 * ((3-1) * fact((3-1)-1)) = 3 * ((3-1) * (if ((3-1)-1) =0 then 1 else (((3-1)-1)-1) * fact (((3-1)-1)-1))) = 3 * ((3-1) * (if (2-1) =0 then 1 else (((3-1)-1)-1) * fact (((3-1)-1)-1))) = 3 * ((3-1) * (if 1 =0 then 1 else ((3-1)-1) * fact (((3-1)-1)-1))) = 3 * ((3-1) * ((3-1)-1) * fact (((3-1)-1)-1))) = 3 * ((3-1) * ((3-1)-1) * (if (((3-1)-1) -1) =0
then 1 else (((3-1)-1)-1) * fact (((3-1)-1)-1)) = 3 * ((3-1) * (((3-1)-1)-1) * (if ((2-1) -1) =0
then 1 else (((3-1)-1)-1) * fact (((3-1)-1)-1)) = 3 * ((3-1) * (((3-1)-1)-1) * (if (1 -1) =0
then 1 else (((3-1)-1)-1) * fact (((3-1)-1)-1)) = 3 * ((3-1) * (((3-1)-1)-1) * (if 0 =0
then 1 else (((3-1)-1)-1) * fact (((3-1)-1)-1)) = 3 * ((3-1) * ((3-1)-1) * 1) = 3 * ((3-1) * ((2-1) * 1) = 3 * ((3-1) * (1 * 1) = 3 * (2 * (1* 1))= 3 * (2 * 1)= 3 * 2= 6
def fact(n) = if n=0 then 1 else n * fact(n-1)
���������� 20
28= !=��=*/
n �#<� ?=�2'���2$/– �� ?9>-%��-��E�5D,<-%��=��2�&
n 674-��E�4;/+�= ?�4>-�� ?=@02��2$/.A6-��='�2��4;/C0;��9B�1E)53:2"– �L
• ���dummy(n) = 0• dummy(fact(-1))
– ����dummy(fact(-1))= 0
– ���dummy(fact(-1)) = dummy(if -1 = 0 then 1 else (-1 * fact(-1-1)))
= dummy(-1 * fact(-1-1))= …
33>��K
GJFIH�(-�� 21
Church-Rosser�Q�C��R
n Q�8�5'�CRChurch-Rosser�U– 0�AI$%��J?;=F/�'�D��B�EI1?34�,
– �'�7 9A3�D2I
n ��U– λ)#Q-�(*C�+�RC�DSChurch-Rosser�7�H"<TG;=S@KA$%��>F&3T
– ��:I6@46D�C�.
�!��
MPLON�+/�� 22
�������
�� ������ 23
�% .�
n .��),BHc.�Q&I�P<Ac3O3OEV]RZWQ��;Md
n =NBHc.�G&I�P<?7BcDGL4E1*$26�(?O45e
n 20���JG/�*$�G+�G!�Fc��-� 'K� 'FL@Ac8G361*$�(�G�-2C:Ac"#9N>da1930��b
n S`U\G������_�% .�aK. Goedelbn TY`[^R��G��aA. Turing, 1936b : CPUn TX`TG�aA. Church, 1936b : .��
V]RZW�-0�� 24
'#,�0�:>�G���$!)�
n )�f8n+18�,f(n)5n7<=�"8)�g( %7f?:6+)4�;>.5,4-*f(0)8�c,�:13+>)�
n ��!)� %8���
n %8�Gf(n) = if n = 0 then c else g(n-1, f(n-1))n ��,&��E0��8��F8�72+39*�0'#,��/>
�!��
AD@CB�(*�� 25
��� �%�
n n�3%��!)�����2(�'3%�:��+0�!*98%�
– �@%�f3n+13�)%�g1n267�!*9&%�g3n+13�)%�f1n267�!*9&f(0)3�c&g(0)3�d)�5.0'8%�
n ���%��!3���
n �!3�@– f(n) = if n = 0 then c else g(n-1)– g(n) = if n = 0 then d else f(n-1)
n ��)"��32/'04&�-#�)��,8
� ���
<?;>=�$&�� 26
���� ���� ������
定義A1:原始帰納的関数(primitive recursive function)とは,次を有限回繰り返して定義される関数である組み込み関数n 定数関数 C(x1,..., xn) = c (定数)n 後者関数 S(x) = x+1n 射影関数 Proji (x1,..., xn) = xiすでに定義した関数の組み合わせn 合成‒ f(x) = g(h1(x), ..., hk(x))
n 原始帰納‒ f(x1,..., xn-1, 0) = g(x1,..., xn-1)‒ f(x1,..., xn-1, y+1) = h(x1,..., xn-1, y, f(x1,..., xn-1, y))
�����
���������� 27
���� �����
n 原始帰納的関数は多くの有用な関数を書けるn しかし,原始帰納的関数で書けない関数もある.
�������� 28
アッカーマン関数Ack(m, n) ‒ 任意の自然数m, nに対して値が求まる(全域的)‒ 原始帰納的関数では表せないことが証明されている(入力m,nに対して,どのような原始帰納的関数よりも早く値が増大する.)
Ack(0, n) = n + 1Ack(m, 0) = Ack(m-1, 1)Ack(m, n) = Ack(m-1, Ack(m, n-1))
Wilhelm Ackermann (1928). “Zum Hilbertschen Aufbau der reellen Zahlen”. Mathematische Annalen 99: 118?133. doi:10.1007/BF01459088
�� ��
�������� �
n
���
29
n すべてのgが正則なら,帰納的関数と呼び,そうでないとき,部分帰納的関数という.‒ gが正則: 任意の入力xに対して,必ずあるyが存在してgの値が0になること.
QV]QA��
n QV]QA��b+JZLYNUIC;)�^S[KXU_>� �)�>I�$6D/,
S[KXU�&*��30
Alonzo Church (1903–1995)
wikipedia��&� !XUP%�A��!
�"QW]Y\K��b S[KXU>R]OICE:<`S[KXUA'FA%�I7G��^1930��@Turing2��aCPUA� ���_n ��1b(��@� �?)�=-G>5>`9H2QW]Y\KTM\=(�%�"?5>B�^+(�]],b�2Yes?E��6<�0I�72`�02NoA>3BNoI�71`��6?4<#._
n ��2b� �?)�=-G>5>`9H2QW]Y\KTM\=%�"?5>B�a^�8��6<`�0I�75>_
�������� 31
��������GCD����������
���������
��
32
5DG>FC8@(��780-850)
n ��<69:;-��� �J���J����HMuhammad ibn Mūsā al-Khwārizmī I
n �� 5B=5�-���!3�K 5D7C8A!*#$��.J5DG>FC8@-��,'+4)(%02&K
n 5D7C8A!L "1�3�/1&/-�/02&��- �
?E6BA����� photo: http://ja.wikipedia.org/wiki/, "Muhammad ibn Musa Al-hwarizmi"33
ho[jbd
n Euclid (Greek: Εὐκλείδης)n 3��300 ,SUn WkZ^mdjWP!�4s
n ho[jbdPB����8C(Elements)Qr& O'T!�P�5
n ��O�HN�=V�FLel\if+8@#$
http://en.wikipedia.org/wiki/Euclid
n B�8Ctu�P�
ü 1�: �<��P�9ü 2�: <0P��p��/�!q
ü 3�: P�9ü 4�: O n� KT�7�
ü 5�: (�8ü 6�: (�8P��RP�-
ü 7�: !8ü 8�: !8ü 9�: !8ü 10�: )+;8ü 11�: 1���ü 12�: <0n�0ü 13�: %�<�
X`ec�:PY[_gjgm]aM.6JULD�8EP"*p22�P�?5q A3�100�>phttp://en.wikipedia.org/wiki/Euclidq
The frontispiece of Sir Henry Billingsley's first
English version of Euclid's Elements, 1570
GSI
34
8=0:45%���
n �*-!�,��%/;2:37
n � %%����.& �,/;2:37– �?BD#CE%����.�')
n �� m # n %����F– m#n%��%�>��.�,�#�"�,1)+��$?%��"@��%(%A
6<197��� �http://en.wikipedia.org/wiki/Euclid 35
���"�Z#�A��VQUKSMNC�-�C��HW
n � Z�=C��\?]
n � Z\?]C���"� Z J�DIn �.Z
1. Z := 1?37Y2. -� P = 2, 3, 4, 5, ..., min(X, Y) B�8>X.B X ? Y C�
�J�HI4@14X)9Y
3. :CF1AP 5&=4<;GX�B��8;�J P ?8>XZ := Z/P ?%6�2IY�(JP 5&=4I,HX$H+9
4. E8:CF1A[5A4<;GX!2?8> Z J� 8>��9IY
OTLRP *0�� 36
1. ['��H]
��� ofj`hbcV�#�
n ��o�QV$"� pTq
n ��opTqV��� Z _�Y]n �%o
1. JB�_XTKmGB�_YTL]nkOFPN[�^�D]l
2. X = 0U[WmYF�DV��� 3. X > 0U[WmY_XS�PN�\RkY mod XlTXV��� F�D
4. kX := R, Y := XTKR �_�H]l
diage�!A�� 37
1. [���\]
��oUMI^S�BE�DRXZC!
+<::2,565 4>>;=('';<::2@565&:<3'@565'*?/7501.9-)73:<5>48
59/712)���B�'$(===
n 38064.�����;�#�"��<'� &*-!
n �<>@(?A)����.�+-
38064����� 38
� )����
,%&*-!:
���
n �����������������������������– f(x0,x1,…,xn)= if��1 then �1
else if ��2 then �2else if …else f(a0,a1,…,an)
– ���• ��i����f� ��• �if������� f(a0,a1,…,an)�• ai�f�����
�����#
�"�! ���� 39
�����1�
����A�$RTMDA�2
n ����AMSJPNB�$RTM@�2(
n �Y� �#�H�EGMSJPNWOTIQKLA�3�
int gcd(int x, int y){int tmp;while (x != 0) {
if(x>y) {tmp = x;x = y;y = tmp;
} else {tmp = y % x;y = x;x = tmp;
}}
return y;}
gcd(x,y) = if x > y then gcd(y,x)else if x = 0 then yelse gcd(mod(y,x), x)
�V�&6�*-A��C�9U�&6C�9VA+"��?A��A,%@=5>BW!4�0�U�&6�*-�'V?.�9>5GA?W:<FH)>7;85X
MSJPN /4�� 40
��!��
n $� – ���� "5
– �����
– �� �� �2/(&'.03
– �4GCD2-1&/)+!���3
– �����
n ,%0*
– �� �!��# ���#