Merhaba,

Emre Sevinç <[EMAIL PROTECTED]> şöyle yazmış:

Zekeriya KOÇ wrote:

Merhaba,
Lisp ile yeni yeni ilgileniyorum. Uzun zaman önce bir kenara bıraktığım Douglas Hofstadter'in Gödel, Escher, Bach (GEB) kitabını yeniden okumaya başladım ve kitabın ilk bölümünde verilen bir bulmacayı Lisp ile kodlamaya çalıştım. Aşağıdaki kodda bazı başlangıç değerleri ve konuyla ilgili listelere uygulanabilecek kuralları karşılayan fonksiyonlar var.


Ne kadar eglenceli bir e-posta bu böyle! :)


;;; mu.lisp ;;;
(defvar *miu* '(M I U))  ;; Biçimsel dizge.
(defvar *ilksav* '(M I)) ;; Baslangic dizgesi.
(defvar *hedef* '(M U))  ;; Bulunmasi istenen dizge.

(defun gecerli-p (dizge)
  (dolist (i dizge t)
    (if (not (member i *miu* :test #'equal))
    (return nil))))


Korkunc bir performansi olabilecegini düsünsem de bazen, ben set-difference fonksiyonunu seviyorum (bkz. matematik formasyonu almis
ve idealar dünyasinda yasayan insan profili:

(defun gecerli-p (dizge)
   (not (set-difference dizge *miu*)))

Eger girdi dizgesinde *miu* listesinde olmayan bir eleman var ise o elemani (bunu true kabul edebiliriz) aksi takdirde
NIL döndürür.

illa member fonksiyonu kullanilacaksa, :test keyword'üne bu durum icin gerek var mi? Varsayilan
test zaten #equal degil mi?

kullandığım sbcl-0.9.12-win32 + emacs ortamında "(member " yazdığımda emacs mini-buffer içinde (test #'eq) şeklinde gözüküyor. Belki sbcl'nin linux için olan ileri versiyonlarında varsayılan karşılaştırma #'equal olabilir bilemiyorum maalesef.




(defun k3 (dizge)
  (if (gecerli-p dizge)
      (let ((sayac1 0)
        (sayac2 0))
    (dolist (i dizge dizge)
      (setf sayac1 (1+ sayac1))
      (if (equal i 'I)
          (setf sayac2(1+ sayac2))
        (setf sayac2 0))
      (if (= sayac2 3)
(return (remove 'I dizge :start (- sayac1 3) :end sayac1)))))))


Böyle bol sayacli, dolistli bir seyler görünce aklima LOOP'a gidiyor nedense:

http://www.gigamonkeys.com/book/loop-for-black-belts.html

Bu arada o "mu" bilmecesinin yani talep edilen ispatin varligina, yokluguna dair bir fikriniz var mi?

Oradaki asil kilit nokta odur cünkü.


Henüz bulmacanın çözümünün verildiği bölüme gelmedim ama daha önceki okumamdan hatırladığım kadarıyla "MU" teorami "MIU" dizgesi içinde ispatlanamaz (türetilemez) şeklinde bir sonuç çıkıyordu.Zaten bunu yazmamdaki sebep sadece Lisp kodlamak için küçük bir bahane teşkil etmesiydi benim için. "Maksat ayağınız alışsın" (burada "eliniz") deyimindeki gibi.

Teşekkürler.




--
Zekeriya KOÇ
 http://www.metkoi.com/zekus

_______________________________________________
cs-lisp mailing list
cs-lisp@cs.bilgi.edu.tr
http://church.cs.bilgi.edu.tr/lcg
http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp

Cevap