クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

Prolog の基本

レッスン全文をここで読めます。無料アカウントを作成すると、実際のラボで実践できます。

コンテナラボ読了目安 13分コマンド8個

Cat の祖父母はだれ?

家系図なら、線を 2 本たどれば分かります。ふつうの言語のプログラムで同じことをするには、手順をひとつずつ書く必要があります。Prolog は違います。本当のことを書いておき、質問をすると、答えを自分で見つけてくれます。

このレッスンの終わりに

メモ

事実と規則について、Prolog のプログラムに質問できる。

キーワード

  • 事実:プログラムに「本当だ」と教えたこと。
  • 規則:ほかのことが本当なら本当になる文。
  • クエリ:プログラムにする質問。
  • 変数:大文字で始まり、見つけたい答えを表す名前。たとえば X。
  • 再帰:自分自身を使う規則。

はじめに:もう知っていること

メモ

頭の中で答えましょう。1. x + 2 = 5 のとき、x はいくつ? 2. 「雨なら傘を持つ」で、傘を持つ前に本当でなければならないことは? 3. 家系図で、祖父母とは何? 答え: 3。x は式を成り立たせる数を表すから。雨が降っていること。親の親。

始める前に

メモ

レッスンの上のバーにある ラボを開始 を押し、動いていると表示されるまで待ちます。コンテナはひとつ、prolog です。ブラウザーで開く画面はないので、ターミナルを使います。docker exec prolog は、その中でコマンドをひとつ実行する命令です。それぞれのコマンドはファイルを読み込み、質問をひとつして、終わります。表示されるものはすべて英語で、このページの言語には関係ありません。下の 実行 ボタンは、それぞれのコマンドをラボのターミナルに、同じセッションの中で順番に入力します。様子を見たいときや自分で入力したいときは、バーの ターミナルを開く(新しいタブ) を押します。

事実は、本当のことを書いた 1 行

このコマンドは事実のファイルを表示します。parent(tom, ann). のような行がひとつの事実で、「tom は ann の親だ」と読み、最後はピリオドで終わります。% で始まる行はコメントです。Prolog はファイルに書いてあること以外は何も知りません。

コマンド
docker exec prolog cat facts.pl

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

クエリは、何かが本当かどうかをたずねる

最初のコマンドは facts.pl を読み込み、tom が ann の親かどうかをたずねます。-g は実行するゴール、-t halt は終わったあとに止める指定です。事実があるので yes と表示されます。2 つめは、ann が dan の親かどうかをたずねます。それは事実にないので、ゴールは失敗し、何も表示されません。出力がないのは「本当だと示せない」という意味です。

コマンド
docker exec prolog swipl -q -g "parent(tom, ann), writeln(yes)" -t halt facts.pl

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

コマンド
docker exec prolog swipl -q -g "parent(ann, dan), writeln(yes)" -t halt facts.pl

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

変数は「だれ?」をたずねる

大文字で始めると変数になり、Prolog は合う事実をすべて探して埋めます。forall はすべての答えを順に回り、writeln が 1 つずつ表示します。最初のコマンドは tom の子を、事実が書かれている順に ann、ben と表示します。2 つめは質問を逆にして、ben の親はだれかをたずね、tom と表示します。

コマンド
docker exec prolog swipl -q -g "forall(parent(tom, X), writeln(X))" -t halt facts.pl

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

コマンド
docker exec prolog swipl -q -g "forall(parent(X, ben), writeln(X))" -t halt facts.pl

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

確認

ヒント

ben の子はだれで、どの順に表示される? 答え: dan、eve の順。その事実がその順に書かれているからです。子のいない人については何も表示されません。

規則は、部分が本当なら本当になる

family.pl には規則があります。grandparent(X, Z) :- parent(X, Y), parent(Y, Z). は、「X が、ある Y の親で、その Y が Z の親なら、X は Z の祖父母だ」と読みます。:- は「ならば」、カンマは「かつ」です。祖父母についての事実はだれも書いていません。このコマンドは tom の孫をたずね、cat、dan、eve と表示します。

コマンド
docker exec prolog swipl -q -g "forall(grandparent(tom, X), writeln(X))" -t halt family.pl

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

規則は自分自身を使える

祖先とは、親か、祖先の親です。2 つめの規則は自分自身を呼ぶので、木をたどれるところまでたどります。findall はすべての答えをリストに集めます。最初のコマンドは [ann,ben,cat,dan,eve] を表示し、ann についての 2 つめは [cat] を表示します。

コマンド
docker exec prolog swipl -q -g "findall(X, ancestor(tom, X), L), writeln(L)" -t halt family.pl

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

コマンド
docker exec prolog swipl -q -g "findall(X, ancestor(ann, X), L), writeln(L)" -t halt family.pl

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

よくある思い込み

注意

Prolog のプログラムは、レシピのように上から 1 行ずつ実行されると思われがちです。そうではありません。事実と規則は何が本当かを述べ、何を求めるかは質問が決めます。また、クエリが何も表示しないのは、プログラムが壊れているとか、現実で答えが偽だという意味ではありません。書かれた事実からは答えを証明できない、という意味です。事実をひとつ足せば、同じ質問が成功することもあります。

最後の確認

ヒント

見返さずに答えましょう。1. parent(tom, ann). は何を言っている? 2. X と tom はどこが違う? 3. 規則の :- はどんな意味? 4. 自分自身を使う規則を何という? 答え: tom は ann の親で、これは事実。X は大文字で始まるので、見つけたい変数。「ならば」。再帰。

先生へ

ヒント

このレッスンは、ラボの中で進めるレッスンの小さな見本です。手順と実行ボタンがレッスンで、ラボは生徒ひとりひとりのコピーです。ラボは SWI-Prolog のインタープリターと 3 つの小さなファイルを入れたコンテナがひとつで、自動採点はありません。生徒は、した質問とそれぞれの答え、family.pl に足した自分の規則とそれが働くことを示す質問、事実と規則の違いについての一文を提出します。要点:1. 事実は本当だと述べた文。2. クエリは何かが本当かをたずね、変数は「だれ」をたずねる。3. 規則は部分が本当なら本当になる。4. 自分自身を使う規則は、構造をたどれるところまでたどる。よくある思い込み:プログラムを手順の並びとして読むこと、出力がないのを「偽」と読むこと。準備:ラボとそのターミナル。ヒント:コマンドを実行する前に答えを予想させ、事実をひとつ足して何が変わるかを見せましょう。答えは毎回同じで正確で、事実が書かれた順に出ます。名前とメッセージはすべて英語で、ページの言語には関係ありません。

このラボとソースについて: Prolog ラボ:事実、規則、質問で学ぶ論理型プログラミングをブラウザーで

授業で教えていますか?これらのレッスンを生徒に割り当て、採点と生徒ごとのラボを使えます。