1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf ·...

39
dgafe-Y)+ "5 1)+(&i% bf`c\j20150 !Idgafe-Y)+,JZVLWj('[.[^YZj*'hiM# QWL]Rkbf`cZ,_$MKUSZ\j[/\*'ZK_]R[XONTPLk 20160j% dgafe-H 1 [bf`cl :DDA544FFF2;=?3;CD3:@=E96;3683<A4G6B;>4AE74AB@B;B@?4

Upload: others

Post on 18-Oct-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 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

Page 2: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

���������

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

Page 3: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

��)��

��

n �1=fact&����:��;– /(�4#�"�%�$. "

n �2=– (1) 69587gcd(m,n)&(2)����:��;<��),&*%�$. "<

– (2) ���-��3��$�2"�*�14�:!+0 �!;

n ��=

n �*'���!1)�>

69587���� 5

Page 4: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

��!��

n $� – ���� "5

– �����

– �� �� �2/(&'.03

– �4GCD2-1&/)+!���3

– �����

n ,%0*

– �� �!��# ���#

Page 5: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

� 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

Page 6: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

�����

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

Page 7: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

���� �

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

Page 8: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

����.���

n ����#��'5)1-/ ����6�00�%,!��-��'53",�*��60�'$+#��

n ����/�(&2��#��'5+/�4,!.*� #��– �<

• (-1)! = (-1) * (-2)!= (-1)* (-2) * (-3)!= …

8;7:9�� �� 10

Page 9: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

� � �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

Page 10: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

�����+����

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

Page 11: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

��

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

Page 12: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

�����"��&�

n � ��-����– �� $��#����#�

– ��'���%"��!��

• ��������������������

• ������� �

• ������� ��

– ����������� ���

),(+*��� 14

Page 13: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

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

Page 14: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

#�������(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

�����

Page 15: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

+,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

Page 16: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

��������

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

Page 17: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

��,����)����*

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

Page 18: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

� ���������

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

Page 19: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

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

Page 20: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

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

Page 21: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

�������

�� ������ 23

Page 22: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

�% .�

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

Page 23: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

'#,�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

Page 24: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

��� �%�

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

Page 25: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

���� ���� ������

定義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

Page 26: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

���� �����

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

�� ��

Page 27: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

�������� �

n

���

29

n すべてのgが正則なら,帰納的関数と呼び,そうでないとき,部分帰納的関数という.‒ gが正則: 任意の入力xに対して,必ずあるyが存在してgの値が0になること.

Page 28: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

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>_

Page 29: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

�������� 31

Page 30: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

��������GCD����������

���������

��

32

Page 31: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

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

Page 32: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

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

Page 33: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

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

Page 34: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

���"�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]

Page 35: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

��� 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

Page 36: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

59/712)���B�'$(===

n 38064.�����;�#�"��<'� &*-!

n �<>@(?A)����.�+-

38064����� 38

� )����

,%&*-!:

Page 37: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

���

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

Page 38: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

�����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

Page 39: 1 )+ &i - 北海道大学arim/pub/proriron/program5.pdf · n原始帰納的関数は多くの有用な関数を書ける nしかし,原始帰納的関数で書けない関数もあ

��!��

n $� – ���� "5

– �����

– �� �� �2/(&'.03

– �4GCD2-1&/)+!���3

– �����

n ,%0*

– �� �!��# ���#