Transcript Document
• معرفی زبان برنامه نویسی لیسپ ارایه دهندگان: آزاده دهقان رحمت آبادی درسا رحمتیان اسما ایزدی نام استاد: جناب آقای قاضی زاده درس: طراحی وپیاده سازی 2 lisp دوشنبه2015/07/20 ، INTRODUCTION TO LISP 4 lisp دوشنبه2015/07/20 ، فهرست .1معرفی زبان لیسپ .2نوع داده های لیسپ .3مقایسه زبان لیسپ و c++ .4ویژگی های زبان لیسپ .5برنامه نویسی ابتدایی به زبان لیسپ و اشنایی با دستورات آن 5 lisp دوشنبه2015/07/20 ، قسمت اول :معرفی زبان برنامه نویسی لیسپ ()Lisp ( Lispلیسپ) یک دسته از زبان های برنامه نویسی است که شامل چند زبان برنامه نویسی است با تاریخچه ای طوالنی ،که همه چیز در آن به صورت پرانتز گذاری شده و با نمایش prefix notationاست که در سال ۱۹۵۸ساخته شد. Lispاز نظر قدمت دومین زبان برنامه نویسی سطح باال ( high-level ) programming languageاست که امروزه هم مورد استفاده قرار می گیرد .فقط زبان فورتن در زبان های سطح باالیی که هنوز استفاده می شوند از لیسپ قدیمی تر است. معروف ترین زبان های برنامه نویسی خانواده ی لیسپ زبان برنامه نویسی Common Lispو Schemeاست. 6 lisp دوشنبه2015/07/20 ، لیسپ برای اهداف ریاضی درست شده بود که از روش عالمت گذاری حسابگر lambdaآقای Alonzo Churchاستفاده می کرد. لیسپ به سرعت به زبانی برای کارهای تحقیقاتی هوش مصنوعی تبدیل شد و مورد توجه محققان در این زمینه قرار گرفت. لیسپ که یکی از اولین زبان های ساخته شده بود در بسیاری از زمینه های علم کامپیوتر پیشگام بود که در زیر بعضی از آن ها را مشاهده می کنید: 7 lisp دوشنبه2015/07/20 ، )tree data structures ( ساختمان دادهای درخت automatic ( مدیریت ذخیره سازی اتوماتیک )storage management 2015/07/20 ،دوشنبه )dynamic typing( نوع داده ای پویا )conditionals( دستورهای شرطی )higher-order functions ( تابع های سطح باال )recursion( تابع های بازگشتی ) (معادل فارسی پیدا نکردمcompile self-hosting lisp 8 اسم “ ”Lispاز عبارت “ ” List Processingبه دست آمده است .لیست پیوندی ( )Linked Listیکی از مهم ترین ساختمان داده ها در زبان لیسپ است و خود سورس کد زبان لیسپ هم لیست است. زبان برنامه نویسی لیسپ ,کد یک برنامه ی نوشته شده را می تواند به عنوان یک ساختمان داده ی لیست بگیرد و آن را پردازش کند و تغییراتی روی آن انجام دهد. 9 lisp دوشنبه2015/07/20 ، 10 lisp دوشنبه2015/07/20 ، در شکل زیر نمودار زمانی شکل گیری زبان های عضو خانواده ی لیسپ را می بینید. 11 lisp دوشنبه2015/07/20 ، قسمت دوم :نوع داده های زبان برنامه نویسی لیسپ ()Lisp همین طور که در مقدمه بررسی کردیم زبان لیسپ بیشتر برای کار های محاسباتی و هوش مصنوعی طراحی شده است ،در زبان های برنامه نویسی هوش مصنوعی ما بیشتر ازنوع داده های عددی به سیمبول ها احتیاج داریم تا عبارات منطقی و گزاره ها را بررسی کنیم.به طور کلی نوع داده در زبان برنامه نویسی لیسپ به صورت زیر است: نوع داده های عددی نوع داده ای کاراکتر نوع داده های منطقی نوع داده ای سمبول 12 lisp دوشنبه2015/07/20 ، نوع داده ای عددی در لیسپ: نوع داده ای عددی در لیسپ شامل اعداد صحیح ،ممیز شناور ،مختلط و کسری است.لیسپ معمولی از bignumsبرای نشان دادن مقدارهای عددی با دقت و اندازه دلخواه استفاده میکند .نوع کسری ،کسرها را با دقت نشان میدهد ،این ویژگی در بسیاری از زبانها وجود ندارد .لیسپ معمولی به صورت اتوماتیک مقدارهای عددی را بین این دادهها به صورت مناسب وارد میکند .در لیسپ می توان با اعداد خیلی بزرگ کار کرد بدون اینکه نگران سر ریز آن ها بود زیرا لیسپ یک رنج 13بزرگ را در اختیار می گذارد lisp دوشنبه2015/07/20 ، .در اسکرین شاتی که گرفتیم انواع نوع داده ای عددی را در لیسپ می بینید: همین طور که در شکل باال می بینید جذر عدد منفی چهار را به صورت عدد مختلط چاپ کرده است 14 lisp دوشنبه2015/07/20 ، نوع داده ای کاراکتر : در لیسپ نوع داده ی دیگری به نام کاراکتر داریم که فقط محدود به اعداد اسکی نیست و یونی کد ها را هم در بر می گیرد .برای تعریف داده های کاراکتری باید از \ #استفاده کرد مانند تصویر زیر که چند نوع داده ی کاراکتری را مشخص کرده ام: 15 lisp دوشنبه2015/07/20 ، نوع داده ای منطقی: در لیسپ نوع منطقی هم داریم که دو حالت درست و غلط را دارد.حالت درست رابا trueوحالت غلط را با NILیا () نشان می دهیم .در شکل زیر ما تابع Listpرا فرا خوانده ایم که خروجی اش یک مقدار منطقی است و می گوید چیزی که تابع رویش فراخوانی شده است لیست است یا نه؟ : 16 lisp دوشنبه2015/07/20 ، نوع داده ای سمبول: مهم ترین نوع داده ای در لیسپ نوع سمبول است که در هوش مصنوعی ,پردازش زبان های طبیعی و … از آن استفاده می کنیم. در شکل زیر لیستی از سمبول ها ساخته ایم: 17 lisp دوشنبه2015/07/20 ، مهمترین کاربرد در هوش مصنوعی 18 lisp دوشنبه2015/07/20 ، زیرا : 19 lisp دوشنبه2015/07/20 ، داده ها اشیای داده اولیه : و ((S-Expression اتم در لیسپ به معنای چیزی است که به اجزای کوچکتری تجزیه نمی شود. یک اتم در لیسپ می تواند یک نماد یا یک عدد یا رشته اي از کاراکترها باشد. اعداد(اتمهای عددی) به شکل صحیح یا ممیز شناور قابل استفاده هستند رشته ها به صورت”رشته هایی از نمادها”نمایش داده می شوند 20 lisp دوشنبه2015/07/20 ، لیسپ بین برنامه و داده تمایز قائل نمی شود تا طراحی مفسر لیسپ ساده باشد. ترتیب اجرا با فراخوانی تابع و عبارات شرطی مشخص می شود. اجرای برنامه لیسپ شامل ارزیابی تابع لیسپ است. Read 21 مترجم لیسپ تابع است lisp دوشنبه2015/07/20 ، اتم و لیست 22 lisp دوشنبه2015/07/20 ، 23 lisp دوشنبه2015/07/20 ، 24 lisp دوشنبه2015/07/20 ، 25 lisp دوشنبه2015/07/20 ، بعضی از توابع آماده در لیسپ 26 lisp دوشنبه2015/07/20 ، <(append '(1 3 5 7) '(2 4 6 8)) (1 3 5 7 2 4 6 8) <)cons ‘)a b c( ‘)d e f(( ((a b c) d e f) 2015/07/20 ،دوشنبه lisp 27 28 lisp دوشنبه2015/07/20 ، 29 lisp دوشنبه2015/07/20 ، 30 lisp دوشنبه2015/07/20 ، 31 lisp دوشنبه2015/07/20 ، 32 lisp دوشنبه2015/07/20 ، دستورات کنترلی در لیسپ 33 lisp دوشنبه2015/07/20 ، دستور شرطی if یک شرط ساده در لیسپ ifمی باشد .این معموال سه آرگومان می گیرد :عبارت ،test عبارت thenو عبارت else .عبارت testارزیابی شده در صورتی که مقدار درست برگرداند عبارت thenارزیابی می شود .در صورتیکه عبارت testمقدار false برگرداند سپس عبارت elseارزیابی شده و مقدار آن برگردانده می شود . 34 lisp دوشنبه2015/07/20 ، تعریف تابع در لیسپ 35 lisp دوشنبه2015/07/20 ، 36 lisp دوشنبه2015/07/20 ، تعریف تابع جدید شما می توانید تابع جدیدي با defunتعریف کنید .این معموال سه و یا تعداد بیشتري آرگومان می گیرد :یک نام ،یک لیست از پارامترها و یک یا تعداد بیشتري از عبارات که بدنه ي تابع را خواهند ساخت .در اینجا توسط تابع ،بدست آوردن سومین عنصر را تعریف می کنیم : اولین آرگومان می گوید که اسم این تابع our-thirdخواهد بود .دومین آرگومان که لیست ( )xاست می گوید که تابع دقیقا یک آرگومان می گیردX .یک سمبول است که به عنوان یک نگهدارنده ي مکانی که در اینجا متغیر نامیده می شود می باشد .زمانیکه متغیري براي نمایش یک آرگومان یک تابع بکار می رود مانند xآنرا پارامتر می نامیم .دنباله ي تعریف ( )car (cdr (cdr xبه عنوان بدنه ي تابع شناخته شده است .این قسمت کاري که لسیت براي محاسبه ي مقدار برگشتی تابع انجام می دهد را مشخص می کند .بنابراین فراخوانی our-thirdبرگرداندن ( )car (cdr (cdr xبراي هر مقدار xکه به عنوان آرگومان به آن می دهیم است . 37 lisp دوشنبه2015/07/20 ، مثال:تابعی بنویسید که بررسی کند مجموع دو عدد از عدد سوم بزرگتر است یا خیر؟ 38 lisp دوشنبه2015/07/20 ، توابع بازگشتی یک تابعی که می تواند خود را فراخوانی کند بازگشتی نام دارد .زبان لیسپ تابع را تست می کند که آیا عنصر یک لیست می باشد یا خیر .در اینجا یک نمونه ساده از تعریف یک تابع بازگشتی وجود دارد : )(defun our-member (obj lst )(if (null lst nil )(if (eql (car lst) obj Lst )))))(our-member obj (cdr lst 39 lisp دوشنبه2015/07/20 ، eqlتساوي دو آرگومان باهم را تست می کند ،گذشته از آن همه چیزي که در این تعریف وجود دارد قبال مشاهده شده است .در عمل به این صورت است : ((> (our-member ’b ’)a b c )(B C ((> (our-member ’z’)a b c NIL در تعریف our-memberبرار بودن حروف بررسی می شود .براي تست اینکه هر شی objیک عضو لیست lstمی باشد -1 :ابتدا بررسی می شود که lstخالی است .اگر آن خالی است آنگاه به وضوح معلوم است که objیک عضو آن نمی باشد و هیچ کاري انجام نمی شود -2 .در غیر اینصورت اگر objعنصر اول lstباشد .آن یک عضو است -3 .در غیر اینصورت objتنها یک عضوي از lstاست اگر آن یک عضو از بقیه ي lstباشد 40 lisp دوشنبه2015/07/20 ، تابع خروجی format formatعمومی ترین تابع خروجی در زبان لیسپ می باشد .این تابع دو یا تعداد بیشتري آرگومان می گیرد :اولی نشان می دهد که خروجی کجا باید چاپ شود ،دومین آرگومان نشان دهنده ي قالب رشته می باشد و آرگومانهاي باقیمانده معموال اشیایی هستند که در جاهاي مشخص شده در داخل قالب چاپ می شوند .دراینجا یک مثال آورده شده : 41 lisp دوشنبه2015/07/20 ، تابع ورودی read readتابع استاندارد براي ورودي می باشد .زمانی که هیچ آرگومانی داده نمی شود این تابع از مکان پیش فرض می خواند ،که معموال سطح باال می باشد .در اینجا تابعی وجود دارد که از پرامپت ،ورودي کاربر را گرفته و هر آنچه را که گرفته بر می گرداند . 42 lisp دوشنبه2015/07/20 ، تعریف متغیرهای محلی یکی از اپراتورهایی که معموال در لسیپ استفاده می شود letاست ،که به شما اجازه تعریف متغیرهاي محلی جدید را می دهد یک عبارت letدو بخش دارد .ابتدا لیستی از دستورالعمل ها براي ایجاد متغیرها براي هر نوع فرمی می آید .هر متغیر در ابتدا توسط عبارت نظیر خود مقدار دهی می شوند. همانطور که در مثال باال ما دو متغیر xو yایجاد کردیم که به ترتیب با 1و 2 مقداردهی اولیه می شوند .این متغیر ها در بین بدنه letمعتبر می باشند .بعد از متغیرها و مقادیر بدنه عبارت می آید که براساس قوانین ارزیابی می شوند ،که در مورد مثال قبل تنها یکی وجود دارد و آن فراخوانی +است .مقدار آخرین عبارت به عنوان مقدار letبازگردانده می شود. 43 lisp دوشنبه2015/07/20 ، تعریف متغیر سراسری متغیرهایی که تاکنون دیده ایم متغیرهاي محلی نامیده می شود .آنها فقط در یک محدوده ي مشخص معتبر می باشند .در اینجا نوع دیگري از متغیرها وجود دارد که متغیر سراسري نامیده می شود که می تواند در هر کجایی قابل دسترسی باشد .شما با دادن یک سمبول و یک مقدار به defparameterمی توانید یک متغیر سراسري ایجاد کنید . )> (defparameter *glob* 99 **GLOB چنین متغیري در هر جایی قابل دسترسی خواهد بود به جز در عباراتی که متغیر هاي محلی جدیدي با همین نام ایجاد شده باشد .براي جلوگیري از این اتفاق که بصورت تصادفی رخ می دهد ابتدا و انتهاي نام متغیرهاي سراسري را با عالمت * نشان می دهند .نام متغیري که ما ایجاد ک دیر م""star-glob-starتلفظ می شود .شما می توانید با فراخوانی defconstantثابت هاي سراسري تعریف کنید. ))<(defconstant limit (+ *glob* 1 در اینجا نیازي نیست که به ثابتها نام متمایز داده شود چرا که هرکسی که بخواهد از این نام براي تعریف متغیرها استفاده کند خطا ایجاد خواهد کرد .اگر شما بخواهید بررسی کنید که هر سمبول یک متغیر سراسري و یا یک ثابت است از boundpاستفاده می کنیم. )*< (boundp '*glob دوشنبهT 2015/07/20 ، lisp 44 انتساب در زبان لیسپ به طور کلی از اپراتور setfبراي انتساب استفاده می شود .ما می توانیم براي انتساب هر نوع متغیري از آن استفاده کنیم . )<(setf *glob* 98 98 ))> (let ((n 10 )(setf n 2 )n 2 زمانی که اولین آرگومان به setfداده می شود یک سمبولی که نام آن یک متغیر محلی نمی باشد به عنوان یک متغیر سراسري گرفته می شود . ))>(setf x (list 'a 'b 'c )(A B C 45 lisp دوشنبه2015/07/20 ، فاکتوریل: بازگشتی <(defun fact (n) (if (= n 0) 0 (if (= n 1) 1 (* n (fact (- n 1)))))) FACT <(fact 3) 6 <(fact 0) ERROR 2015/07/20 ،دوشنبه lisp 46 سری فیبوناچی: بازگشتی 0 1 1 2 3 5 8… <(defun fibo (n) (if ( = n 0) 0 (if (= n 1) 1 (+ (fibo (- n 1)) (fibo (- n 2)))))) FIBO <(fibo 0) 0 <(fibo 4) 3 2015/07/20 ،دوشنبه lisp 47 مجموع اعداد یک لیست: بازگشتی >(defun sum-list (numbers) (if (null numbers) 0 (+ (first numbers) (sum-list (cdr numbers))))) >(sum-list ‘)2 4 6 8)) 20 2015/07/20 ،دوشنبه lisp 48 دوبرابر کردن اعداد یک لیست: بازگشتی <(defun double-list (numbers) (if (null numbers) nil (cons (* 2 (first numbers)) (double-list (cdr numbers))))) DOUBLE-LIST <(double-list '(1 2 3 4)) (2 4 6 8) 2015/07/20 ،دوشنبه lisp 49 :مثال <(defun teenager (age) (if (and (> age 12) (< age 20)) "Teenager" "Not teenager")) <(append '(1 3 5 7) '(2 4 6 8)) (1 3 5 7 2 4 6 8) <)cons ‘)a b c( ‘)d e f(( ((a b c) d e f) 2015/07/20 ،دوشنبه lisp 50 کار به رشته 51 lisp دوشنبه2015/07/20 ، Finding the length of a string: length کار با رشته ها Reversing a string: reverse Joining two (or more) strings together: concatenate Getting a subsequence from a string: subseq 2015/07/20 ،دوشنبه lisp 52 53 lisp دوشنبه2015/07/20 ، 54 lisp دوشنبه2015/07/20 ،