12th Theorem Proving and Provers (TPP 2016)

浅井 健一 / Kenichi Asai
お茶の水女子大学 / Ochanomizu University

November 14 (Mon) to 15 (Tue), 2016

Abstract: TPP (Theorem Proving and Provers) ミーティングは、2005 年から 年に1回開催され、定理証明系を作っている人から使う側の人まで 幅広い人たちが集まり、 様々な側面からの話をしてアイディアの交換をしてきたものです。

ミーティング期間中の討論を大切にしたいと考えていますので、 出来上がった仕事の講演だけでなく、 進行中の仕事、未完成の仕事についての講演も歓迎します。 参加者には可能な限りご講演いただきたいと希望しています。

1  日時・場所 / Date, Venue

日時
2016 年 11 月 14 日(月)10:40 頃から 15 日(火)12:00 頃まで(予定)
Date
Monday, November 14, around 10:40 to Tuesday, November 15, around 12:00.
場所
お茶の水女子大学 理学部 3 号館 2 階 209 会議室 (地図の 20 番の建物)
Venue
Ochanomizu University, Faculty of Science Building No. 3, 2nd floor, meeting room 209. (The building No. 20 in this map.)
住所
112-8610 東京都文京区大塚 2-1-1
Address
112-8610, 2-1-1 Otsuka, Bunkyo-ku, Tokyo
懇親会 Dinner party
2016 年 11 月 14 日(月)18:00 から 食彩酒席 ビカヴォ (東京都文京区大塚3-1-12 コダマビル 1F, 03-5977-1717)

2  プログラム / Program

参加者
37 名程度。 (うち懇親会参加者 20 名。)

3  TPPmark

今年は、趣向を少し変えて、依存型プログラミング系の問題を出題します。

3.1  問題(依存型プログラミング的な表現)

引数として以下の3つ
  1. リストのリスト lst
  2. 整数 i
  3. 整数 j
を受け取ったら、 lsti 番目のリストの j 番目の要素を 削除したものを返す関数 remove-lst を作成せよ。 その際、以下の3つの条件
  1. lsti 番目のリストが存在する。
  2. i 番目のリストの j 番目の要素が存在する。
  3. 返されるリストたちの長さは、i 番目のみ 1 短くなっており、他は変わらない。
が保証されるようにせよ。 (ここで、先頭はいずれも 0 番目とする。)

3.2  問題(論理的な表現)

以下の3つのデータがある。
  1. リストのリスト lst
  2. 整数 i
  3. 整数 j
このとき、lsti 番目のリストの j 番目の 要素を取れるならば、以下を満たすリストが(唯一)存在することを示せ。

lst の中の であるようなリストで、返ってくるリストたちの長さは、 になっている。 (ここで、先頭はいずれも 0 番目とする。)

3.3  OCaml によるプログラム

この問題(の依存型プログラミング表現の方)を (3つの条件を満たさない形で)OCaml を使って書くとremove.ml のようになります。 (プログラム中のテストが、プログラムの入出力の具体例になっています。) このプログラム中、2か所に現れる raise CannotHappen となるケースを、上手に引数に条件を加えることで、 起こり得ないようにするとともに、 返ってくるリストの長さが所定のところのみ 1 小さくなっていることを 示してくださいと言うのが問題の趣旨です。

2か所の例外は、 どちらもリストの長さを考慮すれば簡単に削除できそうに見えます。 lst の長さを nlst 中の各リストの長さを順に m0,...,mn-1 としましょう。 すると i は 0 から n-1 までの整数、 j は 0 から mi-1 までの整数とすれば良いでしょう。 ここで問題となるのは j の範囲が mi(したがって i)に依存しているところです。 それをうまく書けるかどうかが知りたいです。

3.4  問題の背景

項の単一化を行う際には、メタ変数に項を代入します。 例えば SK 論理の式 SXK(YKZ)K があったとしましょう。 ここで X, Y, Z はメタ変数です。 この式のメタ変数 YS を代入すると SXK(SKZ)K が得られます。 この代入の操作の際、メタ変数は [X; Y; Z] の3つから [X; Z] のふたつに減っています。 この操作が、上の問題で lst の長さが 1 の場合に 対応しています。 つまり、lst の 0 番目のリストの 1 番目の Y を削除し、 残ったメタ変数のリストを返しています。

この例では「SK 論理の式」というひとつの概念のみを扱っていたので、 メタ変数もそれを表す1種類のみでした。 上の問題は、 項の種類を複数に拡張し、相互再帰している場合に対応しています。 今、項が n 種類からなり、それらが相互再帰しているとします。 n 種類の項に対応したメタ変数がそれぞれ m0,...,mn-1 個 あったとしましょう。 この状態で、i 番目の項の j 番目のメタ変数に 代入を行うと、代入後のメタ変数は、そのひとつだけが削除された形になります。

現在、このような形でメタ変数の数を管理しながら項の単一化のプログラムを 書こうとしているのですが、相互再帰してメタ変数の種類が複数になった場合、 どのようにして良いのかわからなくなり、 皆さんのお知恵を借りたいと思った次第です。

3.5  寄せられた解答

OCaml (!)
Garrigue さん
Agda
松本・山田さん
Coq 系
Garrigue さん森口さん井上さん池渕さん佐藤さん山本さん小島さん

4  過去の TPP / Past Workshops


This document was translated from LATEX by HEVEA.