SlideShare a Scribd company logo
1 of 20
Lisp tutorial for Pythonista.
Day #5 : LISP = LISt Processor




                                                         Ransui Iso
                          Strategic Technology Group, X-Listing Co, Ltd.
宿題は OK?
今日はリスト処理
 ちょっと深く潜る
リストの S 式表現と升・矢印表現

●    混乱したら図に立ち戻るとイイことがある
(defvar lst '(a (1 2) (3 . 4))


    lst


           A


                   1       2     3   4
練習問題

●   次の S 式表現のリストを升・矢印表現で書きなさい
((1 ((name "Cons Cell")
     (age 28)
     (likes (Python Lisp))))
 (2 ((name "Ham Spam") 
     (age 32)
     (likes ()))))


(defun fact(x)
  (if (= x 1) 1 (* x (fact (1­ x)))))
リスト操作と再帰

●       とても相性がイイ
         ●   何でもかんでも再帰ってのもアレゲだ
         ●   使い所の見極めが肝心

    –   例えばリストのトップレベルを反転する関数を考えてみる

        CL­USER> (my­reverse '(1 2 (3 4)))
        ((3 4) 2 1)
問題を単純化してみる

●   要素が2個の時
                      (cdr lst)
    lst


             1         2   (car (cdr lst))

          (car lst)


    lst                       演習問題:
                              上の情報を参考に、左のような
                              反転されたリストは cons 関数
             2         1      をつかってどうやって作成でき
                              るか?
任意の長さのリストの時は?

●   要素が2個の時はどうやったか?
     ●   リストの末尾の car 部分を使って新しい cons を作る
     ●   1 個前の cons セルの car 部分を car にもつ cons セル新しく作っ
           て上の cons セルにつなぐ

●   リストの末尾かどうかはどうやって判定する?
     ●   セルの cdr が nil かどうかを調べればいい
コードに書いてみる

●   cons セルを連結していく部分を書いてみる
(defun my­reverse (lst)
  (append (my­reverse (cdr lst)) (cons (car lst) nil)))
     ●   まだ不完全だよ!

     ●   append 関数:リストをつなぐ
          –   (append '(1 2) '(3 4)) → (1 2 3 4)
          –   (append '(1 2) '3) → (1 2 . 3)
          –   (append '(1 2) (cons 3 nil)) → (1 2 3)

              要するに、第一引数の最後の要素の cdr が第二引数を指すようになる
ケツに到達したら?

●   リストの末尾セルの car を使って cons セルを作る
(defun my­reverse (lst)
  (if (null (cdr lst))
      (cons (car lst) nil)
    (append (my­reverse (cdr lst)) 
            (cons (car lst) nil)))
                         分かりやすく cons とか冗長だけどこれでちゃんと動く

ループで書くとこんな感じ
(defun my­loop­reverse (lst)
  (let ((result nil))
    (dolist (x lst)
      (push x result))
    result))
                       問題が小さいから再帰のご利益が薄いけど、まぁ練習だ。
例題 :Maze Solver

●   迷路を解くよ
    0,0   1,0   2,0   3,0   ...
                                  問題の条件
    0,1         2,1

                                  1:迷路に閉路は無いものとして考える
    0,2
                                  2:スタート・ゴール地点は任意に与える
    0,3
                                  3:解は辿った座標のリストとする

    ...


                            4,5
迷路のモデルを考える
●   迷路をリストで表現する
          ●   ある座標に注目したときに移動できる座標のリストを作る
                                  (((1 1 NIL) ((1 2)))
    0,0   1,0   2,0   3,0   ...
                                   ((3 1 NIL) ((3 2)))
                                   ((5 1 NIL) ((5 2)))
    0,1         2,1
                                   ((1 2 NIL) ((1 3) (1 1)))
                                   ((3 2 NIL) ((3 3) (3 1)))
                                   ((5 2 NIL) ((5 3) (5 1)))
    0,2                            ((1 3 NIL) ((2 3) (1 2)))
                                   ((2 3 NIL) ((1 3) (3 3)))
                                   ((3 3 NIL) ((2 3) (3 4) (3 2)))
    0,3                            ((5 3 NIL) ((5 4) (5 2)))
                                   ((3 4 NIL) ((3 5) (4 4) (3 3)))
                                   ((4 4 NIL) ((3 4) (5 4)))
    ...                            ((5 4 NIL) ((4 4) (5 3)))
                                   ((1 5 NIL) ((1 6)))
                                   ((3 5 NIL) ((3 6) (3 4)))
                            4,5
                                   ((1 6 NIL) ((2 6) (1 5)))
                                   ((2 6 NIL) ((1 6) (3 6)))
                                   ((3 6 NIL) ((2 6) (4 6) (3 5)))
                                   ((4 6 NIL) ((3 6) (5 6)))
                                   ((5 6 NIL) ((4 6) (6 6)))
                                   ((6 6 NIL) ((5 6))))




1 エントリの構造:((x y mark) ((nx1 ny1) (nx2 ny2) ... ))
探索:まずはゴールの処理から
●   再帰は終了条件と終了時の戻り値が肝

    0,0   1,0   2,0   3,0   ...
                                              goal に辿り着いた
    0,1         2,1               移
                                  動                 戻り値
                                  先
    0,2                           座
                                  標
                                      現在の座標      goal の座標
    0,3
                                  移
                                  動
    ...
                                  先
                                  座
                            4,5   標
                                      現在の座標      先の戻り値



                                          以下続く
探索:行き止まりの時
●   ゴールじゃないけど戻らなきゃいけないときもある

    0,0   1,0   2,0   3,0   ...
                                       行き先が無い
    0,1         2,1               移
                                  動          戻り値
                                  先
    0,2                           座
                                  標
                                          nil
    0,3
                                  移
                                  動
    ...
                                  先
                                  座
                            4,5   標
                                          nil



                                      以下続く
探索:ストラテジ

–   現在位置に到達マークを付ける

–   if 現在位置 == ゴール:
     ●   return 現在位置

–   地図データより移動可能な隣接座標のリストを得る
     ●   if 移動可能隣接座標リスト == nil:
          –   return nil

     ●   for 移動先 in 移動可能隣接座標リスト :
          –   探索結果 ← 再帰: ( 移動先 , ゴール )
          –   if 探索結果 != nil:
                ●   return list( 現在位置 , 探索結果 )
          –   else:
                ●   return nil
移動可能位置をさがす関数

 ●   迷路のリスト表現は alist になっているので…
(defun get­movable­positions (maze­map current­position)
    (let ((result nil))
      (dolist (candidate­position 
                (cadr (assoc `(,@current­position t) maze­map :test #'equal)))
        (if (assoc `(,@candidate­position nil) maze­map :test #'equal)
            (push candidate­position result)))
      result))



 ●   「 ` 」:バッククォート
(defparameter lst '(hello world))
(defparameter x 10)
`(ham spam ,x ,lst ,@lst) → (ham spam 10 (hello world) hello world)

        ●   リストの中に要素を直接埋め込むことができる。
             –   「,」      :そのまま埋め込む
             –   「 ,@ 」   :リストを展開して埋め込む
             –
        ●   上手に使えば cons とか list 関数でリストを作成するよりも楽
プログラム全体

●   PasteBin 参照してね
     ●   http://pastebin.com/CamFYQf4

     ●   2次元配列の迷路からリスト形式のマップを作成する関数
          –   ループで一気に作ってます


●   発展問題
     ●   リスト形式の地図をつくりながら解くようにできるだろうか?
          –   最初に一気にリスト形式の地図をつくらない
          –   2次元配列の迷路を直接探索して解を見つけるにはどうすればいいか?

     ●   2次元配列形式の迷路を自動生成する関数を作れるか?
          –   生成された迷路は閉路の無いものであることを保証できるだろうか?
課題です!
動物当てゲーム Lisp Version
   問題そのものは OK だよね?
面倒な部分はコード差し上げます
●   PasteBin にあるです
     ●   http://pastebin.com/X8LgaWG2

●   ヒント
     ●   知識の木の構造を考えるとき
          –   まず最も単純な1段のみの構成を考える :
               ●   質問内容 , Yes の時の答え , No の時の答えをどうやってまとめるか

          –   それが入れ子になっても意味が通じるかを確認する

          –   末端が判定できるかを確認する

     ●   新規の知識を木に導入する方法を考える
          –   末端に到達した地点にいる状態のまま、新知識を木に導入する必要がある

          –   新知識はもともとの木に破壊的に追加して OK
               ●   setf  を使ってリストを強制的に書き換えちゃう

          –   このプログラムは戻り値の伝播を使う必要はない点に注意する

More Related Content

Similar to Lisp Tutorial for Pythonista : Day 5

LINQ を使ったナンプレの解法を作ったお話
LINQ を使ったナンプレの解法を作ったお話LINQ を使ったナンプレの解法を作ったお話
LINQ を使ったナンプレの解法を作ったお話Fumihito Yokoyama
 
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~Takuya Akiba
 
ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界Preferred Networks
 
劣モジュラ最適化と機械学習 2.4節
劣モジュラ最適化と機械学習 2.4節劣モジュラ最適化と機械学習 2.4節
劣モジュラ最適化と機械学習 2.4節Hakky St
 
TokyoNLP#7 きれいなジャイアンのカカカカ☆カーネル法入門-C++
TokyoNLP#7 きれいなジャイアンのカカカカ☆カーネル法入門-C++TokyoNLP#7 きれいなジャイアンのカカカカ☆カーネル法入門-C++
TokyoNLP#7 きれいなジャイアンのカカカカ☆カーネル法入門-C++sleepy_yoshi
 
Ruby科学データ処理ツールの開発 NArrayとPwrake
Ruby科学データ処理ツールの開発 NArrayとPwrakeRuby科学データ処理ツールの開発 NArrayとPwrake
Ruby科学データ処理ツールの開発 NArrayとPwrakeMasahiro Tanaka
 
CODE FESTIVAL 2014 エキシビジョン 解説
CODE FESTIVAL 2014 エキシビジョン 解説CODE FESTIVAL 2014 エキシビジョン 解説
CODE FESTIVAL 2014 エキシビジョン 解説AtCoder Inc.
 
Material
MaterialMaterial
Material_TUNE_
 
Graph convolution (スペクトルアプローチ)
Graph convolution (スペクトルアプローチ)Graph convolution (スペクトルアプローチ)
Graph convolution (スペクトルアプローチ)yukihiro domae
 
Sized Linear Algebra Package のチュートリアル
Sized Linear Algebra Package のチュートリアルSized Linear Algebra Package のチュートリアル
Sized Linear Algebra Package のチュートリアルAkinori Abe
 

Similar to Lisp Tutorial for Pythonista : Day 5 (12)

LINQ を使ったナンプレの解法を作ったお話
LINQ を使ったナンプレの解法を作ったお話LINQ を使ったナンプレの解法を作ったお話
LINQ を使ったナンプレの解法を作ったお話
 
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
 
ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界
 
劣モジュラ最適化と機械学習 2.4節
劣モジュラ最適化と機械学習 2.4節劣モジュラ最適化と機械学習 2.4節
劣モジュラ最適化と機械学習 2.4節
 
TokyoNLP#7 きれいなジャイアンのカカカカ☆カーネル法入門-C++
TokyoNLP#7 きれいなジャイアンのカカカカ☆カーネル法入門-C++TokyoNLP#7 きれいなジャイアンのカカカカ☆カーネル法入門-C++
TokyoNLP#7 きれいなジャイアンのカカカカ☆カーネル法入門-C++
 
Ruby科学データ処理ツールの開発 NArrayとPwrake
Ruby科学データ処理ツールの開発 NArrayとPwrakeRuby科学データ処理ツールの開発 NArrayとPwrake
Ruby科学データ処理ツールの開発 NArrayとPwrake
 
Finite field
Finite fieldFinite field
Finite field
 
CODE FESTIVAL 2014 エキシビジョン 解説
CODE FESTIVAL 2014 エキシビジョン 解説CODE FESTIVAL 2014 エキシビジョン 解説
CODE FESTIVAL 2014 エキシビジョン 解説
 
Material
MaterialMaterial
Material
 
Graph convolution (スペクトルアプローチ)
Graph convolution (スペクトルアプローチ)Graph convolution (スペクトルアプローチ)
Graph convolution (スペクトルアプローチ)
 
Rで学ぶロバスト推定
Rで学ぶロバスト推定Rで学ぶロバスト推定
Rで学ぶロバスト推定
 
Sized Linear Algebra Package のチュートリアル
Sized Linear Algebra Package のチュートリアルSized Linear Algebra Package のチュートリアル
Sized Linear Algebra Package のチュートリアル
 

More from Ransui Iso

「Pythonでやってみた」~広がるプログラミングの愉しみ~
「Pythonでやってみた」~広がるプログラミングの愉しみ~「Pythonでやってみた」~広がるプログラミングの愉しみ~
「Pythonでやってみた」~広がるプログラミングの愉しみ~Ransui Iso
 
Pythonで作る俺様サウンドエフェクター
Pythonで作る俺様サウンドエフェクターPythonで作る俺様サウンドエフェクター
Pythonで作る俺様サウンドエフェクターRansui Iso
 
アドテクを支える人と技術
アドテクを支える人と技術アドテクを支える人と技術
アドテクを支える人と技術Ransui Iso
 
Playing with curses
Playing with cursesPlaying with curses
Playing with cursesRansui Iso
 
小中学生Hack-a-thonにオッサンが乗り込んだ話
小中学生Hack-a-thonにオッサンが乗り込んだ話小中学生Hack-a-thonにオッサンが乗り込んだ話
小中学生Hack-a-thonにオッサンが乗り込んだ話Ransui Iso
 
XML-RPC : Pythonが「電池付属」と呼ばれる理由
XML-RPC : Pythonが「電池付属」と呼ばれる理由XML-RPC : Pythonが「電池付属」と呼ばれる理由
XML-RPC : Pythonが「電池付属」と呼ばれる理由Ransui Iso
 
ソフトシンセを作りながら学ぶPythonプログラミング
ソフトシンセを作りながら学ぶPythonプログラミングソフトシンセを作りながら学ぶPythonプログラミング
ソフトシンセを作りながら学ぶPythonプログラミングRansui Iso
 
Introduction of ToySynth
Introduction of ToySynthIntroduction of ToySynth
Introduction of ToySynthRansui Iso
 
PyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミングPyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミングRansui Iso
 
PySynth : A toy pure python software synthesizer.
PySynth : A toy pure python software synthesizer.PySynth : A toy pure python software synthesizer.
PySynth : A toy pure python software synthesizer.Ransui Iso
 
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Ransui Iso
 
Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4Ransui Iso
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Ransui Iso
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Ransui Iso
 
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Ransui Iso
 

More from Ransui Iso (15)

「Pythonでやってみた」~広がるプログラミングの愉しみ~
「Pythonでやってみた」~広がるプログラミングの愉しみ~「Pythonでやってみた」~広がるプログラミングの愉しみ~
「Pythonでやってみた」~広がるプログラミングの愉しみ~
 
Pythonで作る俺様サウンドエフェクター
Pythonで作る俺様サウンドエフェクターPythonで作る俺様サウンドエフェクター
Pythonで作る俺様サウンドエフェクター
 
アドテクを支える人と技術
アドテクを支える人と技術アドテクを支える人と技術
アドテクを支える人と技術
 
Playing with curses
Playing with cursesPlaying with curses
Playing with curses
 
小中学生Hack-a-thonにオッサンが乗り込んだ話
小中学生Hack-a-thonにオッサンが乗り込んだ話小中学生Hack-a-thonにオッサンが乗り込んだ話
小中学生Hack-a-thonにオッサンが乗り込んだ話
 
XML-RPC : Pythonが「電池付属」と呼ばれる理由
XML-RPC : Pythonが「電池付属」と呼ばれる理由XML-RPC : Pythonが「電池付属」と呼ばれる理由
XML-RPC : Pythonが「電池付属」と呼ばれる理由
 
ソフトシンセを作りながら学ぶPythonプログラミング
ソフトシンセを作りながら学ぶPythonプログラミングソフトシンセを作りながら学ぶPythonプログラミング
ソフトシンセを作りながら学ぶPythonプログラミング
 
Introduction of ToySynth
Introduction of ToySynthIntroduction of ToySynth
Introduction of ToySynth
 
PyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミングPyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミング
 
PySynth : A toy pure python software synthesizer.
PySynth : A toy pure python software synthesizer.PySynth : A toy pure python software synthesizer.
PySynth : A toy pure python software synthesizer.
 
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6
 
Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
 
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1
 

Recently uploaded

デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 

Recently uploaded (9)

デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 

Lisp Tutorial for Pythonista : Day 5

  • 1. Lisp tutorial for Pythonista. Day #5 : LISP = LISt Processor Ransui Iso Strategic Technology Group, X-Listing Co, Ltd.
  • 4. リストの S 式表現と升・矢印表現 ● 混乱したら図に立ち戻るとイイことがある (defvar lst '(a (1 2) (3 . 4)) lst A 1 2 3 4
  • 5. 練習問題 ● 次の S 式表現のリストを升・矢印表現で書きなさい ((1 ((name "Cons Cell")      (age 28)      (likes (Python Lisp))))  (2 ((name "Ham Spam")       (age 32)      (likes ())))) (defun fact(x)   (if (= x 1) 1 (* x (fact (1­ x)))))
  • 6. リスト操作と再帰 ● とても相性がイイ ● 何でもかんでも再帰ってのもアレゲだ ● 使い所の見極めが肝心 – 例えばリストのトップレベルを反転する関数を考えてみる CL­USER> (my­reverse '(1 2 (3 4))) ((3 4) 2 1)
  • 7. 問題を単純化してみる ● 要素が2個の時 (cdr lst) lst 1 2 (car (cdr lst)) (car lst) lst 演習問題: 上の情報を参考に、左のような 反転されたリストは cons 関数 2 1 をつかってどうやって作成でき るか?
  • 8. 任意の長さのリストの時は? ● 要素が2個の時はどうやったか? ● リストの末尾の car 部分を使って新しい cons を作る ● 1 個前の cons セルの car 部分を car にもつ cons セル新しく作っ て上の cons セルにつなぐ ● リストの末尾かどうかはどうやって判定する? ● セルの cdr が nil かどうかを調べればいい
  • 9. コードに書いてみる ● cons セルを連結していく部分を書いてみる (defun my­reverse (lst)   (append (my­reverse (cdr lst)) (cons (car lst) nil))) ● まだ不完全だよ! ● append 関数:リストをつなぐ – (append '(1 2) '(3 4)) → (1 2 3 4) – (append '(1 2) '3) → (1 2 . 3) – (append '(1 2) (cons 3 nil)) → (1 2 3) 要するに、第一引数の最後の要素の cdr が第二引数を指すようになる
  • 10. ケツに到達したら? ● リストの末尾セルの car を使って cons セルを作る (defun my­reverse (lst)   (if (null (cdr lst))       (cons (car lst) nil)     (append (my­reverse (cdr lst))              (cons (car lst) nil))) 分かりやすく cons とか冗長だけどこれでちゃんと動く ループで書くとこんな感じ (defun my­loop­reverse (lst)   (let ((result nil))     (dolist (x lst)       (push x result))     result)) 問題が小さいから再帰のご利益が薄いけど、まぁ練習だ。
  • 11. 例題 :Maze Solver ● 迷路を解くよ 0,0 1,0 2,0 3,0 ... 問題の条件 0,1 2,1 1:迷路に閉路は無いものとして考える 0,2 2:スタート・ゴール地点は任意に与える 0,3 3:解は辿った座標のリストとする ... 4,5
  • 12. 迷路のモデルを考える ● 迷路をリストで表現する ● ある座標に注目したときに移動できる座標のリストを作る (((1 1 NIL) ((1 2))) 0,0 1,0 2,0 3,0 ...  ((3 1 NIL) ((3 2)))  ((5 1 NIL) ((5 2))) 0,1 2,1  ((1 2 NIL) ((1 3) (1 1)))  ((3 2 NIL) ((3 3) (3 1)))  ((5 2 NIL) ((5 3) (5 1))) 0,2  ((1 3 NIL) ((2 3) (1 2)))  ((2 3 NIL) ((1 3) (3 3)))  ((3 3 NIL) ((2 3) (3 4) (3 2))) 0,3  ((5 3 NIL) ((5 4) (5 2)))  ((3 4 NIL) ((3 5) (4 4) (3 3)))  ((4 4 NIL) ((3 4) (5 4))) ...  ((5 4 NIL) ((4 4) (5 3)))  ((1 5 NIL) ((1 6)))  ((3 5 NIL) ((3 6) (3 4))) 4,5  ((1 6 NIL) ((2 6) (1 5)))  ((2 6 NIL) ((1 6) (3 6)))  ((3 6 NIL) ((2 6) (4 6) (3 5)))  ((4 6 NIL) ((3 6) (5 6)))  ((5 6 NIL) ((4 6) (6 6)))  ((6 6 NIL) ((5 6)))) 1 エントリの構造:((x y mark) ((nx1 ny1) (nx2 ny2) ... ))
  • 13. 探索:まずはゴールの処理から ● 再帰は終了条件と終了時の戻り値が肝 0,0 1,0 2,0 3,0 ... goal に辿り着いた 0,1 2,1 移 動 戻り値 先 0,2 座 標 現在の座標 goal の座標 0,3 移 動 ... 先 座 4,5 標 現在の座標 先の戻り値 以下続く
  • 14. 探索:行き止まりの時 ● ゴールじゃないけど戻らなきゃいけないときもある 0,0 1,0 2,0 3,0 ... 行き先が無い 0,1 2,1 移 動 戻り値 先 0,2 座 標 nil 0,3 移 動 ... 先 座 4,5 標 nil 以下続く
  • 15. 探索:ストラテジ – 現在位置に到達マークを付ける – if 現在位置 == ゴール: ● return 現在位置 – 地図データより移動可能な隣接座標のリストを得る ● if 移動可能隣接座標リスト == nil: – return nil ● for 移動先 in 移動可能隣接座標リスト : – 探索結果 ← 再帰: ( 移動先 , ゴール ) – if 探索結果 != nil: ● return list( 現在位置 , 探索結果 ) – else: ● return nil
  • 16. 移動可能位置をさがす関数 ● 迷路のリスト表現は alist になっているので… (defun get­movable­positions (maze­map current­position)     (let ((result nil))       (dolist (candidate­position                  (cadr (assoc `(,@current­position t) maze­map :test #'equal)))         (if (assoc `(,@candidate­position nil) maze­map :test #'equal)             (push candidate­position result)))       result)) ● 「 ` 」:バッククォート (defparameter lst '(hello world)) (defparameter x 10) `(ham spam ,x ,lst ,@lst) → (ham spam 10 (hello world) hello world) ● リストの中に要素を直接埋め込むことができる。 – 「,」 :そのまま埋め込む – 「 ,@ 」 :リストを展開して埋め込む – ● 上手に使えば cons とか list 関数でリストを作成するよりも楽
  • 17. プログラム全体 ● PasteBin 参照してね ● http://pastebin.com/CamFYQf4 ● 2次元配列の迷路からリスト形式のマップを作成する関数 – ループで一気に作ってます ● 発展問題 ● リスト形式の地図をつくりながら解くようにできるだろうか? – 最初に一気にリスト形式の地図をつくらない – 2次元配列の迷路を直接探索して解を見つけるにはどうすればいいか? ● 2次元配列形式の迷路を自動生成する関数を作れるか? – 生成された迷路は閉路の無いものであることを保証できるだろうか?
  • 19. 動物当てゲーム Lisp Version 問題そのものは OK だよね?
  • 20. 面倒な部分はコード差し上げます ● PasteBin にあるです ● http://pastebin.com/X8LgaWG2 ● ヒント ● 知識の木の構造を考えるとき – まず最も単純な1段のみの構成を考える : ● 質問内容 , Yes の時の答え , No の時の答えをどうやってまとめるか – それが入れ子になっても意味が通じるかを確認する – 末端が判定できるかを確認する ● 新規の知識を木に導入する方法を考える – 末端に到達した地点にいる状態のまま、新知識を木に導入する必要がある – 新知識はもともとの木に破壊的に追加して OK ● setf  を使ってリストを強制的に書き換えちゃう – このプログラムは戻り値の伝播を使う必要はない点に注意する