Prolog ラボ:事実、規則、質問で学ぶ論理型プログラミングをブラウザーで

このラボでは、生徒ひとりひとりに専用の Prolog インタープリターと、読んで変えられる 3 つの小さなファイルが用意されます。ある家族についての事実のファイル、それをもとにした規則のファイル、リストについての規則のファイルです。Prolog のプログラムは、手順をひとつずつ指示しません。何が本当かを述べ、実行とは質問をすることです。

攻撃のラボではありません。どのコピーも、インターネットにも他の生徒にも通じる道がないので、何かをダウンロードすることも、中のものが誰かに届くこともありません。標準のインタープリターだけで、追加のパッケージは入れられません。制約ソルバーでも、ウェブサーバーでも、データベースでもありません。

生徒が学ぶこと

プログラムは事実と規則の集まりになれること、そして質問がその実行のしかたであること。生徒は事実を読み、何かが本当かどうかをたずね、変数で「だれ」をたずね、ほかの 2 つの文から作られた規則を読み、自分自身を呼ぶ規則をたどってすべての祖先を見つけます。また、出力がないのは、プログラムが壊れているのではなく、書かれた事実からは答えを示せないという意味だと知ります。プログラミングのパラダイムや、情報科学における論理の入門に向いています。正確な文言は各自の試験団体の単元で確認してください。ここでは何も引用していません。

ブラウザーで動かす

ラボは、公式の swipl イメージから prolog というサービスをひとつ、権限のないアカウントで起動します。ウェブページはないので、ラボのバーの「ブラウザーで開く」の下にリンクはなく、質問にはターミナルを使います。インタープリターには docker exec prolog に続けて swipl と質問を入力して届きます。レッスンの各コマンドは、ファイルを読み込み、-g オプションで質問をひとつして、-t halt で止まるので、必ず終わります。答えは毎回同じで、事実が書かれた順に出ます。表示されるものはすべて英語で、ページの言語には関係ありません。

インタープリターと対話するには、「ターミナルを開く」を押して docker exec -it prolog swipl -q family.pl と入力します。?- のプロンプトで、parent(tom, X). のようにピリオドで終わる質問を入力します。X = ann と表示され、セミコロンを押すと次の答えが出ます。halt. と入力すると終わります。

  1. コンテナーのページを開く. バーの「つくる」を開き、「コンテナーを実行」を選びます。ページは誰でも開けて、Git ラボと SQL ラボはアカウントなしで起動できます。ほかのラボには無料アカウントが必要です。アカウントを作成してサインインし、「起動」を押します。
  2. ラボを探す. 「サンプルラボ」のカードにすべてのサンプルが並んでいます。Prolog:事実、規則、質問を探します。
  3. 「起動」を押す. 「起動」はそのまま1回の操作で実行します。「先にファイルを編集」は compose ファイルを開くので、起動する前に変更できます。
  4. 開く. 開くウェブページはありません。ラボのページで「ターミナルを開く」を押し、docker exec prolog swipl -q -g "forall(parent(tom, X), writeln(X))" -t halt facts.pl と入力すると、tom の子、ann、ben の順に表示されます。

生徒に提出させるもの

した質問とそれぞれの答え:はいかいいえの質問、変数を使う質問、grandparent か ancestor の規則を使う質問。そのうえで、family.pl に足した自分の規則(たとえばおばやいとこ)と、それが働くことを示す質問、事実と規則の違いについて自分の言葉で一、二文。自動採点はありません。規則と文章で理解が分かります。さらに進めるなら、何も表示しない質問が、偽の主張と同じではない理由をたずねてください。

このラボで進める基本のレッスン

Prolog Basics は、このラボの中で進める小さなレッスンです。事実を読み、何かが本当かをたずね、変数で「だれ」をたずね、規則を読み、自分自身を呼ぶ規則をたどります。

無料の個人アカウントでは、ホームにある Basics モジュールで使え、どの学校もライブラリの Basics フォルダーからコピーできます。わざと小さくしてあります。ラボで進めるレッスンとは何かを先生に見せるためで、あとはラボが担います。変えたいときは、自分のモジュールにコピーしてください。

GitHub のコード

compose ファイルには Dockerfile がありません。公式の公開イメージ SWI-Prolog をバージョン 9.2.9 に固定し、権限のないアカウントで、メモリ 128 MB で動かします。イメージのライセンスは BSD-2-Clause で、当社は配布していません。ファイルは最初の起動時に 3 つの小さな練習ファイルを書き、ボリュームに保存するので、生徒が変えたものは停止して再開したあとも残ります。限界も正直に述べます。ラボには外へ出る道がないため追加のパッケージは入れられず、教えるのは家系図を使った論理型プログラミングの考え方で、Prolog が使われる大きなプログラムではありません。

課題として出す

課題の中で、何を提出するかを書いてください。

  1. ラボを作る. モジュールで課題を追加し、「コンテナーラボ」のカードを選んでから「GitHub リポジトリ」を選びます。https://github.com/mitsurutech/lab-prolog-lab とブランチ main を指定します。compose ファイルは既定の compose.yaml です。変更したい場合は、たとえば最初のファイルに事実を増やしたいときは、先にリポジトリをフォークしてください。
  2. 公開して試す. 「公開」すると、確認したコミットに固定されるので、あとでリポジトリを変更しても、すでに出したラボは変わりません。まず自分のコピーを起動してください。
  3. 配布する. ほかの課題と同じように配布します。期限を付けることもでき、課題には何をするか、何を提出するかを書いておきます。
  4. 提出物を採点する. 生徒のコピーを開いて提出された内容を確認し、採点します。足りない場合は理由を書いて差し戻します。

このラボを試す、そして費用

無料の個人アカウントで、このラボの基本レッスンに取り組めます。毎月、ほとんどのレッスンに足りる無料クレジットがあり、カードは要りません。クラスで使う場合、学校は最初の365日間、生徒50人まで無料で、その後は生徒1人あたりの年額です。すべてのラボが含まれ、教職員は無料です。

よくある質問

質問が何も表示しないことがあるのはなぜ?
ゴールが失敗したからです。書かれた事実と規則からは、本当だと示せません。これはエラーではなく、現実で偽という意味でもありません。事実をひとつ足せば、同じ質問が成功することもあります。知らない名前は別で、Unknown procedure というエラーが表示されます。
他の言語のページでも、名前やメッセージが英語のままなのはなぜ?
事実、ファイル名、インタープリターのすべてのメッセージは英語で、ラボはそれを変えません。レッスンがそのことを述べ、各答えをページの言語で説明します。
生徒の変更は保存される?
はい、そのコピーでは保存されます。ファイルはボリュームにあるので、ラボを停止して再開しても残ります。生徒が消したファイルは、次にラボが起動するときに元の形で書き直されます。