宿題:論理型言語#
Homework 約30分 答え
以下は講義中に紹介した家系図を定義するPrologプログラムである.
parent(maximilian, tom).
parent(wilhelmina, tom).
parent(tom, harry).
parent(tom, jason).
parent(tom, carla).
parent(ada, harry).
parent(ada, jason).
parent(ada, carla).
male(maximilian). male(tom). male(harry). male(jason).
female(wilhelmina). female(ada). female(carla).
child(C, P) :- parent(P, C).
father(F, C) :- parent(F, C), male(F).
mother(M, C) :- parent(M, C), female(M).
married(H, W) :- child(C, H), child(C, W), H \= W, !.
% grandmother(GM, C) :- ???
% sister(S, X) :- ???
家系図に対する質問は次の通り(1).
?-はプログラマが入力する文字列ではない点に注意せよ.
bagof/3は2項目の論理式の結果が複数ある場合,その全てをリストとして受け取る論理式である.対話的な実行を避けるための工夫であり,深く考える必要はない. Q0.#
オンラインのPrologコンパイラSWISHにアクセスし,青色のProgram を押下せよ.画面左がPrologプログラムの記述画面,右下が質問の入力画面,右上が出力画面である.
Q1.#
上記Prologプログラムと質問を実行し,出力結果を答えよ.
Q2.#
祖母grandmother/2の論理式を完成させ,次の質問が適切に動作するようにせよ.
Q3.#
姉妹sister/2の論理式を完成させ,次の質問が適切に動作するようにせよ.ここでの姉妹とは姉と妹のペアのことではなく,ある人物から見た姉か妹という関係の意味である.
以下の書式をコピーして回答せよ.Q2とQ3はPrologの出力ではなく,完成させた論理式を答えよ.
Answer
Q1.
Q2. Q3.これは正しくないので注意.
姉と妹は複数あり得るのでカット!/0してはいけない.論理として正しくない.
しかし,カットがないと複数の解が得られてしまう.
sister(S, X) :-
parent(P, X), parent(P, S), female(S), S \= X.
?- bagof(S, sister(S, harry), L5). % L5 = [carla, carla]
parent/2は父と母の2つの単一化(マッチングのパス)があるためである.parent/2の代わりにfather/2(あるいはmother/2)を使えば単一化は1つに定まり,重複が発生しなくなる. Q&A#
:口頭での解説はスキップ
誤字#
- Tom
自信自身
論理型言語に対する印象#
面白いと思った
苦手だと思った
新鮮に感じた
論理の構築が難しいと感じた
自然言語の文章に近く記述しやすいと感じた
直感的でわかりやすかった。
手順を書かずに事実とルールだけで答えを出せるのが新鮮だった
適用できる場面は限定的だろう
👍👍👍
石渡先生の解析学で述語論理はかなり学習したため理解しやすかった#
great
一階述語論理を理解している人からすれば,かなり簡単な講義だったと思います.関数型言語Lispがほぼラムダ式と等価であったのと同様,Prologはほぼ一階述語論理と等価です.
論理型言語はアキネーターみたいだと思った#
あれもエキスパートシステムの一種ですが,仕組みはかなり異なります.機械学習の一つである決定木を使っています.
「推論」と呼ばれる処理がコンピュータで広く求められる処理であり,かつ様々な実現方法があることを認識しておくと良いです.
論理型言語は成否の二値しか扱えないのに対して,LLMはベクトルを用いてより豊かな表現を扱えると解釈した#
良い解釈 👍👍👍
述語論理自体は真偽値(True/False)しか扱えないので,適用できる世界がかなり限定的です.
命令型と宣言型の明確な境界はあるのか?#
関数型言語は関数を組み合わせるが,関数も命令の一種では?
境界はありません.パラダイムは規範であり厳密な定義はできません.
Prologは単一化を深さ優先で全探索しているといことか?#
Yes.
関数型は他の言語にも取り入れられているが,論理型にもそのような要素はあるか?#
言語内部の処理(型推論)に取り入れられています.逆に言えば,プログラマが直接的に論理型言語から由来する表現・機能を使う場面はないかもしれません.
Javaの仕様の一部にProlog構文で定義されている部分があります.プログラマの共通言語として使われていたりします.
gcd(8, X, 4)が実行できない理由がよくわからない.無限の可能性があるからか?#
この理由は述語is/2の限界に由来します.可能性の数の問題ではありません.
is/2は右辺を左辺に代入するような述語です.厳密には左辺を右辺で単一化しています.
次の処理は成功します.is/2の右辺に変数Aがありますが,Aの値は既知なので右辺全体を具体的な値へ単一化できます.
一方,is/2の右辺に未知の変数を記述するとエラーが発生します.
is/2は右辺を具体化できないと失敗します."Arguments are not sufficiently instantiated"です.
このあたりの振る舞いもPrologの限界だと思います.論理式としては正しくても,言語エンジン自体の振る舞いで正しくなくなる場合がある.