プログラミング言語概論・練習問題

Prolog 編

Prolog のプログラムは Ideone または、RextesterTry SWI-Prolog online を利用して実行せよ。

注意: 一般的な Prolog の対話的な処理系では、「;」を入力すると、 別解を探索するが、Ideone 上では対話的な処理系は提供されていない。 そのため、Ideone で Prolog のプログラムを実行するときは、最後に

program :- findall(変数, ゴール, Bag), print(Bag).

のような一行を追加してすべての別解を表示させる必要がある。 ここで変数は、結果を見たい変数(例: X) または変数の組(例: (X,Y,Z))で、ゴールは実行したい Prolog への質問(ゴール)の式である。 例えば、program :- findall((X,Y), append(X, Y, [1,2,3]), Bag), print(Bag). とすると、 質問 append(X, Y, [1,2,3]). のすべての解の XY の組を表示する。

問 1

以下の徳川将軍家の家系図のプログラムについて、以下の問に答えよ。

予備: Rextester

  1. 他の親子関係(child(… …))で知っているものがあれば追加せよ。 あるいは徳川家以外の有名な一族の家系図を追加せよ。

  2. 兄弟の関係を表す述語 brother(X,Y)「X と Y は兄弟である。」を定義せよ。

  3. 甥(姪)の関係を表す述語 nephew(X,Y)「X は Y の甥(姪)である。」を定義せよ。

問 2

以下の append(リストの連接)のプログラムについて、以下の問に答えよ。

予備: Rextester

  1. [1,2,3][1,2,3,4,5] (あるいは他のリスト)にかえて試してみよ。

問 3

以下のプログラムについて、以下の問に答えよ。

予備: Rextester

  1. findall((X,Y), delete([1,2,3,4], X, Y), Bag), print(Bag).を質問するとその結果はどうなるか? まず予想し、実行して確かめよ。

  2. findall(X, permutation(X, [1,2,3,4]), Bag), print(Bag).を質問するとその結果はどうなるか? まず予想し、実行して確かめよ。


Koji Kagawa