Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Integrated Shrinking による 高階関数の自動生成 / PRO-2020-4 Generating Higher-Order Functions by Integrated Shrinking

Integrated Shrinking による 高階関数の自動生成 / PRO-2020-4 Generating Higher-Order Functions by Integrated Shrinking

情報処理学会 第132回プログラミング研究発表会で発表した「Integrated Shrinking による 高階関数の自動生成」の発表スライドです。

Db1b7e3c6fe6f6a0e9752b2c19bf5473?s=128

TSUYUSATO Kitsune

January 14, 2021
Tweet

Transcript

  1. 1 日本大学文理学部情報科学科 藤浪大弥 情報処理学会 第132回プログラミング研究発表会 (PRO-2020-4) 2021年1月14日 2020-4-(5) Integrated Shrinking

    による 高階関数の自動生成
  2. 2 情報処理学会 第132回プログラミング研究発表会 (PRO-2020-4) 2021年1月14日 2020-4-(5)「Integrated Shrinking による高階関数の自動生成」藤浪大弥 関数の生成・縮小 2

    Integrated Shrinking 1 Scala による実装の説明 2 考察 3 Property Based Testing について 1 アジェンダ
  3. 3 情報処理学会 第132回プログラミング研究発表会 (PRO-2020-4) 2021年1月14日 2020-4-(5)「Integrated Shrinking による高階関数の自動生成」藤浪大弥 考察 3

    関数の生成・縮小 2 Integrated Shrinking 1 Scala による実装の説明 2 Property Based Testing について 1 アジェンダ
  4. 4 情報処理学会 第132回プログラミング研究発表会 (PRO-2020-4) 2021年1月14日 2020-4-(5)「Integrated Shrinking による高階関数の自動生成」藤浪大弥 Property Based

    Testing とは, ・主に関数型言語で用いられるプログラムのテスト手法 ・満たすべき性質をプログラムとして記述し,  入力データを自動的に生成することで性質を満たすように  実装されているかをテストする. findCounterExample(intGen)(x => x + 0 == x) // => None Property Based Testing とは
  5. 5 情報処理学会 第132回プログラミング研究発表会 (PRO-2020-4) 2021年1月14日 2020-4-(5)「Integrated Shrinking による高階関数の自動生成」藤浪大弥 値の生成方法によって2種類に分けられる. ・乱数生成器を用いて値を生成するもの.

     代表的な実装: QuickCheck ・「小さい」とされる値を順番に生成するもの.  代表的な実装: SmallCheck -1002642896, 233489047, -1670356897, 1597242127, …… 0, 1, -1, 2, -2, 3, -3, 4, -4, 5, -5, …… Property Based Testing の種類
  6. 6 情報処理学会 第132回プログラミング研究発表会 (PRO-2020-4) 2021年1月14日 2020-4-(5)「Integrated Shrinking による高階関数の自動生成」藤浪大弥 乱数生成器を用いる実装の場合, 値の生成だけではなく「縮小」も重要.

    縮小 (Shrink): 性質を満たさないような入力例が見つかったときに, 入力例をより単純なデータにしてユーザーに提示する機能 縮小 (Shrink)
  7. 7 情報処理学会 第132回プログラミング研究発表会 (PRO-2020-4) 2021年1月14日 2020-4-(5)「Integrated Shrinking による高階関数の自動生成」藤浪大弥 生成と縮小は従来の実装では,別の関数として提供される. 値の生成器に対して様々な操作が考えられる.

    ・値の変換 (map)  ・値の制限 (filter) 生成器にこれらの操作を適用した場合, 対応する縮小器も変更する必要があり問題となりやすい. これらを統合的に扱う方法として, Integrated Shrinking [Stanley2017] が知られている. 生成と縮小の統合 (Integrated Shrinking)
  8. 8 情報処理学会 第132回プログラミング研究発表会 (PRO-2020-4) 2021年1月14日 2020-4-(5)「Integrated Shrinking による高階関数の自動生成」藤浪大弥 関数の生成・縮小手法については [Claessen2012]

    などが知られていて, QuickCheck などで実装されている. しかし,関数を引数に取る関数 (高階関数) については サポートされていない. 本研究では,このような高階関数の生成を Integrated Shrinkingの下で実現する手法を提案する. 関数の生成・縮小
  9. 9 情報処理学会 第132回プログラミング研究発表会 (PRO-2020-4) 2021年1月14日 2020-4-(5)「Integrated Shrinking による高階関数の自動生成」藤浪大弥 関数の生成・縮小 2

    Integrated Shrinking 1 Scala による実装の説明 (1) 2 Property Based Testing について 1 考察 3 アジェンダ
  10. 10 情報処理学会 第132回プログラミング研究発表会 (PRO-2020-4) 2021年1月14日 2020-4-(5)「Integrated Shrinking による高階関数の自動生成」藤浪大弥 Integrated Shrinking

    を用いた高階関数の生成・縮小の可能な, 小さな Property Based Testing ライブラリの実装を 200行程度 (228行)の Scala で行う. 一部は省略するので,完全なソースコードは事前配布の資料の 付録 A.1. を参照ください. 実装の説明
  11. 11 情報処理学会 第132回プログラミング研究発表会 (PRO-2020-4) 2021年1月14日 2020-4-(5)「Integrated Shrinking による高階関数の自動生成」藤浪大弥 QuickCheck (従来)

    の生成器オブジェクトの定義 生成器は「乱数生成器を受け取って,(利用後の)乱数生成器と値を返す関数」. (乱数生成器は不変 (immutable) なオブジェクトとする.) これに対して map や product などの操作が定義できる.
  12. 12 情報処理学会 第132回プログラミング研究発表会 (PRO-2020-4) 2021年1月14日 2020-4-(5)「Integrated Shrinking による高階関数の自動生成」藤浪大弥 縮小された値の探索と縮小関数 縮小された値の探索はより小さな値のリストを返す関数

    s (縮小関数) を現在の反例 x に 適用してその中で反例となるものが無ければ現在の値を反例として返し, あればそれに対して再帰的に探索を行う,というように動作する.
  13. 13 情報処理学会 第132回プログラミング研究発表会 (PRO-2020-4) 2021年1月14日 2020-4-(5)「Integrated Shrinking による高階関数の自動生成」藤浪大弥 値の生成と縮小をまとめる 値の生成器オブジェクト

    (g: GenQC[A]) と縮小関数 (s: A => LazyList[A]) をひとまとめで持つと, map や product といった操作を上手く定義できなくなってしまう. ところで,値の縮小は縮小関数を再帰的に適用していくので,これを木構造と見做せば…… 10 (sInt(10) = Seq(5, 8, 9)) (sInt(5) = Seq(3, 4)) (sInt(8) = Seq(4, 6, 7)) (sInt(9) = Seq(5, 7, 8)) 5 3 …… …… …… …… …… …… …… …… 4 4 6 7 5 7 8 8 9
  14. 14 情報処理学会 第132回プログラミング研究発表会 (PRO-2020-4) 2021年1月14日 2020-4-(5)「Integrated Shrinking による高階関数の自動生成」藤浪大弥 Integrated Shrinkingの導入

    生成時に単なる値ではなく,縮小された値の木構造を返す生成器オブジェクトを考える. これに対しては map や product などの操作が上手く定義できる.
  15. 15 情報処理学会 第132回プログラミング研究発表会 (PRO-2020-4) 2021年1月14日 2020-4-(5)「Integrated Shrinking による高階関数の自動生成」藤浪大弥 Integrated Shrinkingの導入

    (Treeの定義) 木構造 (Tree) の定義は上のようになる. このように木構造を用いて値の生成と縮小を行う方法を Integrated Shrinking と呼ぶ [Stanley2017].
  16. 16 情報処理学会 第132回プログラミング研究発表会 (PRO-2020-4) 2021年1月14日 2020-4-(5)「Integrated Shrinking による高階関数の自動生成」藤浪大弥 関数の生成・縮小 2

    Integrated Shrinking 1 Scala による実装の説明 (2) 2 Property Based Testing について 1 考察 3 アジェンダ
  17. 17 情報処理学会 第132回プログラミング研究発表会 (PRO-2020-4) 2021年1月14日 2020-4-(5)「Integrated Shrinking による高階関数の自動生成」藤浪大弥 乱数生成器が分割可能 (splittable)

    とは? split という互いに独立な2つの新しい乱数生成器を返す操作のできる乱数生成器を, 分割可能 (splittable) である,という.
  18. 18 情報処理学会 第132回プログラミング研究発表会 (PRO-2020-4) 2021年1月14日 2020-4-(5)「Integrated Shrinking による高階関数の自動生成」藤浪大弥 乱数生成器に値を反映して,関数を生成する 乱数生成器が分割可能なら,split

    を使って乱数生成器の状態に値を反映させることができる. さらに,それを使って関数を生成することが可能 (functionGenQC). ただし,縮小ができるわけではない.
  19. 19 情報処理学会 第132回プログラミング研究発表会 (PRO-2020-4) 2021年1月14日 2020-4-(5)「Integrated Shrinking による高階関数の自動生成」藤浪大弥 部分関数を表すデータ構造 部分関数を表す代数的データ構造

    (:=>) を導入する [Claessen2012]. パターンマッチの各場合分けに対応するような形になっている. これらには map, table, lift という操作が定義されている.
  20. 20 情報処理学会 第132回プログラミング研究発表会 (PRO-2020-4) 2021年1月14日 2020-4-(5)「Integrated Shrinking による高階関数の自動生成」藤浪大弥 関数を表すデータ構造 :=>

    にデフォルト値を補って全域にした Fun を定義する. これは関数クラスを継承しているため,実際の関数と同様に用いることができて, かつ中身を文字列として表示できる.
  21. 21 情報処理学会 第132回プログラミング研究発表会 (PRO-2020-4) 2021年1月14日 2020-4-(5)「Integrated Shrinking による高階関数の自動生成」藤浪大弥 関数の縮小 部分関数を表すデータ構造に対する縮小関数を定義する.

    引数の s は戻り値の型に対する縮小関数となる. さらに,関数を表すデータ構造に対する縮小関数も定義する.
  22. 22 情報処理学会 第132回プログラミング研究発表会 (PRO-2020-4) 2021年1月14日 2020-4-(5)「Integrated Shrinking による高階関数の自動生成」藤浪大弥 CogenVariant の定義

    よって乱数生成器に値を反映する関数と関数を :=> に変換する関数の組があれば, その型を引数にするような関数を生成・縮小することは可能. (戻り値の型が多相なので trait を利用している)
  23. 23 情報処理学会 第132回プログラミング研究発表会 (PRO-2020-4) 2021年1月14日 2020-4-(5)「Integrated Shrinking による高階関数の自動生成」藤浪大弥 CogenVariant の例

    基本的な型に対する CogenVariant の定義は上のようになる. 2つのメソッドを定義する必要があり煩雑.さらに,この方法で高階関数の生成・縮小が可能かは不明. CogenVariant[A => B] ??
  24. 24 情報処理学会 第132回プログラミング研究発表会 (PRO-2020-4) 2021年1月14日 2020-4-(5)「Integrated Shrinking による高階関数の自動生成」藤浪大弥 Cogen の定義

    1つのメソッドで CogenVariant 相当のものを定義するために, funGenShrink で行なっていたような処理を Cogen の内部で行うようにする (build メソッド). imap は両側の変換から新しい Cogen を得るユーティリティ.
  25. 25 情報処理学会 第132回プログラミング研究発表会 (PRO-2020-4) 2021年1月14日 2020-4-(5)「Integrated Shrinking による高階関数の自動生成」藤浪大弥 Cogen の例

    基本的な型に対する Cogen の定義は上のようになる.
  26. 26 情報処理学会 第132回プログラミング研究発表会 (PRO-2020-4) 2021年1月14日 2020-4-(5)「Integrated Shrinking による高階関数の自動生成」藤浪大弥 高階関数の生成 (考察)

    関数の生成器オブジェクトの定義は次のようだった. 関数に対する Cogen は次のような引数を取ると予想する. Cogen の定義には次の build が必要 今,持っているものは, ・g: Gen[A], c: Cogen[B], gc: Gen[C] これらから, Gen[(A => B) :=> C] を得たい. ???
  27. 27 情報処理学会 第132回プログラミング研究発表会 (PRO-2020-4) 2021年1月14日 2020-4-(5)「Integrated Shrinking による高階関数の自動生成」藤浪大弥 高階関数の生成 (考察)

    持っているもの: g: Gen[A], c: Cogen[B], gc: Gen[C] 得たいもの: Gen[(A => B) :=> C] g から A の値を,c.build(gc) から B :=> C の値を生成できる. :=> は両側からの変換があれば,Iso によって引数の型を変更できる. (A => B) => B の変換: 渡ってきた関数に生成した A の値を適用する. B => (A => B) の変換: 生成した A の値で局所的に定義された関数を返す. (表示のためにしか使わないので問題ではない)
  28. 28 情報処理学会 第132回プログラミング研究発表会 (PRO-2020-4) 2021年1月14日 2020-4-(5)「Integrated Shrinking による高階関数の自動生成」藤浪大弥 高階関数の生成 よって,高階関数の生成のための

    Cogen の定義は上のようになる.
  29. 29 情報処理学会 第132回プログラミング研究発表会 (PRO-2020-4) 2021年1月14日 2020-4-(5)「Integrated Shrinking による高階関数の自動生成」藤浪大弥 Property Based

    Testing ライブラリとしてのインターフェース 最後に,乱数生成器を使って無限に値(の縮小された木構造)を生成する関数と, それを一定数テストして,反例が見つかった場合に縮小を行う関数を用意する. 以上で,高階関数の生成・縮小の可能な Property Based Testing ライブラリの実装が完了する.
  30. 30 情報処理学会 第132回プログラミング研究発表会 (PRO-2020-4) 2021年1月14日 2020-4-(5)「Integrated Shrinking による高階関数の自動生成」藤浪大弥 関数の生成・縮小 2

    Integrated Shrinking 1 Scala による実装の説明 2 Property Based Testing について 1 考察 3 アジェンダ
  31. 31 情報処理学会 第132回プログラミング研究発表会 (PRO-2020-4) 2021年1月14日 2020-4-(5)「Integrated Shrinking による高階関数の自動生成」藤浪大弥 Gen の型について

    Random => (Random, Tree[A]) ≡ State[Random, Tree[A]] (State[Random, *] と Tree の合成) State[Random, *] も Tree も(アプリカティブ)関手 ⇒ その合成も(アプリカティブ)関手 一方,モナドではない. (モナドとするには Random => Tree[(Random, A)] とする必要があるが, この場合の Tree の子要素での Random の扱いが不明) filter を実現するには, Random => (Random, Tree[Option[A]]) と生成される値を Option にして, 制限された値は None で置き換えるようにする.
  32. 32 情報処理学会 第132回プログラミング研究発表会 (PRO-2020-4) 2021年1月14日 2020-4-(5)「Integrated Shrinking による高階関数の自動生成」藤浪大弥 Cogen について

    emptyCogen は eitherCogen に対する(余)単位元である. 一方, unitCogen は productCogen に対する単位元とはならない. productCogen に対して単位元となるような実装は conquerCogen のようになるが, これは実用上あまり便利ではない (再帰的なデータ構造で問題になる). このギャップを埋める必要がある.
  33. 33 情報処理学会 第132回プログラミング研究発表会 (PRO-2020-4) 2021年1月14日 2020-4-(5)「Integrated Shrinking による高階関数の自動生成」藤浪大弥 既存の Property

    Based Testing ライブラリとの比較 ・QuickCheck [Classen2011]: 関数の生成・縮小をサポートしているが, 関数を引数に取ることはできない. ・Hedgehog [Stanley]: Integrated Shrinking だが関数の生成・縮小をサポートしていない. ・小さい値を列挙するタイプのライブラリは,(SmallCheck, Feat, SmartCheck, LeanCheck)
 関数の生成が可能なものもあるが,大きな値でしか反例が見つからない場合に現実的には 発見できないという問題がある. [Runciman2008], [Duregaard2012], [Pike2014], [Matela2017]
  34. 34 情報処理学会 第132回プログラミング研究発表会 (PRO-2020-4) 2021年1月14日 2020-4-(5)「Integrated Shrinking による高階関数の自動生成」藤浪大弥 まとめ 本研究の貢献:

    ・Property Based Testingでの,関数を引数に取る関数の生成・縮小の方法を提案した. ・Integrated Shrinking と組み合わせて実装することで,高階関数の縮小も含め, 縮小の実装を単純化できることを実装によって確認した. 今後の課題: ・この手法の理論的な背景についてはまだ議論の余地があると思われる. (とくに Cogen の扱いについては)
  35. 35 情報処理学会 第132回プログラミング研究発表会 (PRO-2020-4) 2021年1月14日 2020-4-(5)「Integrated Shrinking による高階関数の自動生成」藤浪大弥 参考文献 [Claessen2012]

    Claessen, K.: Shrinking and showing functions: (functional pearl) Proceedings of the 2012 Haskell Symposium, pp. 73–80 (2012) [Claessen2011] Claessen, K. and Hughes, J.: QuickCheck: a lightweight tool for random testing of Haskell programs ACM SIG- PLAN Notices, Vol. 46, No. 4, pp. 53–64 (2011) [Duregaard2012] Duregaard, J., Jansson, P. and Wang, M.: Feat: functional enumeration of algebraic types ACM SIGPLAN Notices, Vol. 47, No. 12, pp. 61–72 (2012) [Matela2017] Matela Braquehais, R.: Tools for discovery, refinement and generalization of functional properties by enumerative testing PhD Thesis, University of York (2017)
  36. 36 情報処理学会 第132回プログラミング研究発表会 (PRO-2020-4) 2021年1月14日 2020-4-(5)「Integrated Shrinking による高階関数の自動生成」藤浪大弥 参考文献 https:

    //hedgehog.qa/ https://yowconference. com/talks/jacob-stanley/yow-lambda-jam-2017/gens-n-roses- appetite-for-reduction-125 [Pike2014] Pike, L.: SmartCheck: automatic and efficient counterexample reduction and generalization Proceedings of the 2014 ACM SIGPLAN symposium on Haskell, pp. 53–64 (2014) [Runciman2008] Runciman, C., Naylor, M. and Lindblad, F.: Smallcheck and lazy smallcheck: automatic exhaustive testing for small values Proceedings of the first ACM SIGPLAN symposium on Haskell, pp. 37–48 (2008) [Stanley] Stanley, J.: Hedgehog will eat all your bugs, [Stanley2017] Stanley, J.: Gens N’ Roses: Appetite for Reduction, YOW! Lambda Jam 2017 (2017)