Рефал - Википедия - Refal

Бас тарту
ПарадигмаҮлгіге сәйкес келеді және Мерзімді қайта жазу
ЖобалағанВалентин Турчин
ӘзірлеушіВалентин Турчин, С.Флоренцев, В.Олюнин және т.б.
Бірінші пайда болды1968 (1968)
Пәнді терукүшті, динамикалық
Веб-сайтhttp://www.refal.net
Майор іске асыру
Refal-2, Refal-5, Refal-6, Refal +

Бас тарту («Рекурсивті функциялар алгоритмдік тіл») «Бұл функционалды бағдарламалау тілі «, соның ішінде» символдық есептеулерге бағытталғанжолдарды өңдеу, тілдік аударма, [және] жасанды интеллект ".[1] Бұл алғаш рет 1966 жылы теориялық құрал ретінде ойластырылған осы отбасының ең ежелгі мүшелерінің бірі, алғашқы іске асырылуы 1968 жылы пайда болды. Refal үлкен және күрделі бағдарламаларды жазу үшін математикалық қарапайымдылық пен практикалықты біріктіруге арналған.

Мұны жасаған алғашқы функционалды бағдарламалау тілдерінің бірі және қазіргі уақыттағы Лисптен айырмашылығы, Refal негізделген үлгілерді сәйкестендіру. Оның үлгісін сәйкестендіру бірге жұмыс істейді мерзімді қайта жазу.

Негізгі мәліметтер құрылымы of Lisp және Prolog - құрастырылған сызықтық тізім минус операциясы ретімен, осылайша O (n) тізімге кіру nші элемент. Рефаль тізімдері екі ұшынан да құрастырылады және сканерленеді, сонымен қатар ішкі деңгейге де, жоғарғы деңгейге де сәйкес келетін үлгі сәйкес келеді. Іс жүзінде Refal-дің негізгі деректер құрылымы а ағаш орнына тізім. Бұл деректер құрылымын құруда еркіндік пен ыңғайлылықты береді, ал тек қана өрнектерді сәйкестендіру мен ауыстыруды басқарудың математикалық қарапайым механизмдерін қолданады.

Refal сонымен қатар мұздатқыш тиімді қолдау ішінара бағалау.

Рефальды ағаш құрылымдарын өңдеуге және түрлендіруге қолдануға болады, ұқсас XSLT.[2]

Негіздері

Рефал Сәлем Әлем мысал төменде көрсетілген.

$ ENTRY Go {= <Сәлем>;} Сәлем {= ;}

Жоғарыдағы бағдарламада Go және Hello деген екі функция бар. Функция функцияның атауы, содан кейін функция денесі бұйра жақшаларда жазылады. Go функциясы $ ENTRY директивасын қолданып бағдарламаның кіру нүктесі ретінде белгіленеді.

Функция денелеріндегі өрнектерді функция «шақыру» деп қарастыруға болады Лисп - синтаксис сияқты. Мысалы, Hello функциясы «Hello world» жолымен кіріктірілген Prout функциясын аргумент ретінде шақыратын көрінеді. Қоңыраудың мәні мен механизмі мүлде басқаша. Айырмашылықты көрсету үшін жолдың а екенін анықтайтын келесі функцияны қарастырыңыз палиндром.

 Пал {= шын; s.1 = шын; s.1 e.2 s.1 = ; e.1 = жалған; }

Бұл мысалда төртеуінен тұратын күрделі денесі бар функция көрсетілген сөйлемдер (тармақтар). Сөйлем а өрнек артынан теңдік белгісі, одан кейін генерал жазылады өрнек оң жақта. Сөйлем нүктелі үтір арқылы тоқтатылады. Мысалы, функцияның екінші сөйлемінің үлгісі «s.1», ал өрнек «True».

Мысалда көрсетілгендей, үлгілерге кіреді үлгі айнымалылар олар айнымалы түрін анықтайтын таңба түріне ие (айнымалы сәйкес келетін), содан кейін айнымалы идентификатор. «S» -ден басталатын айнымалылар бір таңбаға, «e» -ден басталатындар еркін өрнекке сәйкес келеді. Айнымалының идентификаторы типтік идентификатордан міндетті түрде нүкте арқылы бөлінген ерікті әріптік-сандық тізбек болуы мүмкін.

Функция өз дәлелін сөйлемнің заңдылықтарымен анықтамада пайда болған ретімен, сәйкес келетін бірінші үлгіге дейін салыстыру арқылы орындайды. Содан кейін функция аргументті сәйкес сөйлемнің оң жағындағы өрнекпен ауыстырады.

Егер функцияны қолдану нәтижесі бұрыштық жақшалардағы субэкспрессияны қамтыса (бұл біздің мысалдың үшінші сөйлемінен кейін орын алса), одан әрі жақшадағы бірінші символмен анықталған функцияны шақыру арқылы нәтиже Refal арқылы өңделеді. Нәтижесінде осылайша кеңейту үшін бұрыштық жақшалар болмаған кезде орындалу тоқтайды.

Осылайша, Pal функциясын бейресми түрде келесідей оқуға болады: «Егер өрнек бос болса, оны True мәніне ауыстырыңыз. Әйтпесе өрнек жалғыз таңба болса, оны True мәніне ауыстырыңыз. Әйтпесе өрнек таңба болса, оның артынан ерікті өрнек шығады. 2-ден кейін сол таңбаны қойыңыз, оны өрнегімен ауыстырыңыз. (Басқаша айтқанда, екі бірдей белгіні басында және аяғында лақтырып, қайталаңыз). Әйтпесе өрнекті False-мен ауыстырыңыз. (Өрнек e.1 әрқашан сәйкес келеді). «

Төменде келесі қадам жасау үшін әр қадамда қолданылатын сөйлем нөмірлерімен түсіндірілген үш сатылы орындалу іздері келтірілген

  (# 3)  (# 3)  (# 1) True
  (# 3)  (# 2) Рас
  (# 3)  (# 3)  (# 3)  (# 4) False

Енді Hello World мысалы келесі өрнектер түрлендірулерінің реті ретінде орындалатынын көре аламыз:

      $ ENTRY деп белгіленген бастапқы өрнегі бар машинаны себіңіз:  (сөйлемді Go-де қолданыңыз) <Сәлем> (сөйлемді Hello-да қолданыңыз)  (Prout - бұл басып шығаратын және кеңейтетін кіріктірілген ештеңеге) (ештеңе қолдануға болмайды; тоқтату)

Басқа мысалдар

Факторлық

 {0 = 1 факт; s.N = <* s.N <факт <- s.N 1 >>>; }

Мұнда 0 санға 0 сәйкес келеді және оны шығарады. Кез келген басқа таңбада оны (Fact (- s.N 1)) нәтижесімен көбейтіңіз. Операторлардың префикс стиліне назар аударыңыз.

Ілмектері бар факторлық

 {S.n = <цикл 1. цикл>; }; Цикл {0 s.f = s.f; s.n s.f = <Цикл <- s.n 1> <* s.n s.f >>; }

Көрініп тұрғандай s.n цикл есептегішінің рөлін атқарады.

Теңдік

 Тең {(e.1) (e.1) = T; (e.1) (e.2) = F; }

Мұндағы функция, егер екі шарт берілген болса және терминдер бірдей болса, бірінші сөйлем сәйкес келеді және True сөйлемін шығарады, екінші сөйлем сәйкес келеді және False шығарады.

Рефалдың маңызды қасиеті - рефальдағы барлық функциялар бір аргумент болып табылады. (Бірақ жоғарыдағыдай терминдермен тұжырымдалуы мүмкін.)

Егер

Басқару құрылымдарын анықтау оңай

 Егер {T Сонда (e.1) Else (e.2) = e.1; F Сонда (e.1) Басқа (e.2) = e.2; }

Мұнда e1 енгізілген өрнек «True» сәйкес болғанда ғана бағаланады, содан кейін e1 Else e2the e2 үшін бірдей болады.

Бос орындарды қысыңыз

 {E.1 '__' e.2 =  қысыңыз; e.1 = e.1; }

(Функцияның шақыруын түсінікті ету үшін кеңістіктің char орнына '_' таңбасын қолданыңыз.) Бірінші сөйлем Squeeze функциясы өзінің кіріс өрнегінде қосбланға кездесіп, оны бір бос орынға ауыстырған кезде сәйкес келеді. Екінші сөйлем тек біріншісі болмады және ағымдық өрнек болып табылатын нәтижелік мәнді қайтарады.

Айқын циклды пайдаланып қысыңыз

 Қысу {'__' e.1 = <Қысу '_'e.1>; s.A e.1 = s.A <қысыңыз e.1>; =; };

Әдебиеттер тізімі

  • Турчин, Валентин Ф. (1989). «REFAL-5 бағдарламалау жөніндегі нұсқаулық және анықтамалық нұсқаулық». Нью-Йорк қалалық колледжі, New England Publishing Co., Holyoke.
  1. ^ Турчин, Валентин Ф. (1989). «Рефальға кіріспе». REFAL-5 бағдарламалау жөніндегі нұсқаулық және анықтамалық нұсқаулық. Holyoke: New England Publishing Co. мұрағатталған түпнұсқа 2008-07-03. Алынған 2010-04-05.
  2. ^ «Мұрағатталған көшірме». Архивтелген түпнұсқа 2007-12-06 ж. Алынған 2008-03-18.CS1 maint: тақырып ретінде мұрағатталған көшірме (сілтеме)

Сыртқы сілтемелер