title |
---|
プログラミング言語prohell |
- パラダイム: 論理プログラミング
- 型付け: 静的型付け(予定)
- 影響を受けた言語: prolog, haskell, lisp
- 拡張子: phl
prologの構文に不満があったので作成しました.
この文章は,読者がprologの知識を持っていることを前提としています. ただし,それは非常に初歩的なものです.
日本語の資料はM.Hiroi's Home Page / Prolog Programmingがおすすめです.
プログラミング言語prohellは,prologの文法と実行前チェックの強化を目標として作成された言語です. まだ処理系も仕様も未完成です. この文章を信用してはいけません.
prologでは事実は以下のように記述します.
人間(ソクラテス).
prohellでは
人間 "ソクラテス"
prologとprohellには以下のような違いがあります.
- prohellにはアトムはありません
- prohellでは述語の定義にも述語の利用にも括弧が不要です
- prohellでは改行が終端記号として認識されるので,ピリオド(.)は不要です
prologでは規則は以下のように記述します.
死ぬ(X) :- 人間(X).
prohellでは
死ぬ ?x = 人間 x
- prologでは区切りは
:-
, prohellでは=
- prohellでは述語の呼び出しに括弧が不要
- prohellでは引数が自由変数か否か明示的に指定する必要がある
現在は時間と労力が足りなかったため,規則の出力結果は決定的なものとなっています. これは規格違反です. 将来的には全て非決定的なものとする予定です.
prologとprohellの最も大きな違いは,引数が自由変数か否か,頭部で明示的に指定することが必要ということです.
prologでは自由変数かどうかの判定はvar(Term)
のように体部で行っていました.
これは柔軟ですが,実行前のチェックが不可能になります.
prohellは実行前に述語呼び出しと述語の定義を照らし合わせ,存在しない述語呼び出しがあった場合はエラーを検出できる設計になっています(暫定処理系はチェックしません).
引数の記号は,prologのドキュメントの風習に従っています.
AZ-Prolog ユーザーズマニュアルなどを参照のこと.
+
: 自由変数ではない-
: 自由変数である?
: どちらでも良い
prologでは変数名は大文字で始まる必要がありました. それはアトムが存在するからです.
prohellにはアトムがないので,変数名は小文字から始まります. 大文字から始めてはいけません(現在の実装ではOKですが,規格違反です). 大文字から始めてはいけないのは,将来的に型名を大文字から始めるように規則をしたいからです.
prohellでは述語呼び出しに自由変数を渡す場合,頭部に@
をつける必要があります.
これは設計ミスです.
当初はやむをえず必要だと思ったのでこの制限を設定しましたが,必要ありません.
そのうち削除します.
prohellの組み込み述語はbuiltin
ただ1つです.
この述語は最初に文字列,後に任意の引数を受け取ります.
この述語は大半のユーザは使用することはありません.
現在整数と文字列にのみ対応しています.
人間 :: String
人間 "ソクラテス"
のようにして,静的型付けを行うことができるようになる予定です.
未実装です.
swi-prologにはarithmetic_function
という組み込み述語があり,これを述語に使うと最後の引数を戻り値とする算用関数が作成できます.
prohellでは,そのような特別な述語は用意せず,全ての述語を関数化できる構文を用意する予定です.
prohellでは通常のプログラム記述に括弧を使用しないように設計されています.
そこでsin (pi) @r
のように,括弧で囲んだ場合は関数呼び出しであると曖昧性無く伝えることが可能です.
そのために述語のオーバーロードは許しません.
未実装です.
現時点での処理系prohell.rb
はprelude.phl
を読み込み,問い合わせプロンプトを起動します.
prelude.phl
は現状標準ライブラリでもあり,サンプルプログラムでもあり,チュートリアルでもあります.
変数の出力はあくまで仮のものであり,実装依存であることに注意してください.
ソクラテスは人間であるか質問します.
?- 人間 "ソクラテス"
[{}]
true
人間の一覧を質問します.
?- 人間 @x
[{"x"=>[:const, "ソクラテス"]}, {"x"=>[:const, "プラトン"]}]
true
死ぬものを質問します.
?- 死ぬ @死ぬもの
[{"死ぬもの"=>[:const, "ソクラテス"]}, {"死ぬもの"=>[:const, "プラトン"]}]
true
黒魔術師が使用可能な魔法を質問.
?- 魔法 "黒" @使用可能
[{"使用可能"=>[:const, "黒"]}]
true
逆に,黒魔法を使用可能な職業を質問.
?- 魔法 @職 "黒"
[{"職"=>[:const, "黒"]}, {"職"=>[:const, "赤"]}]
true
100の階乗を質問.
?- fact 100 @r
[{"r"=>
[:const,
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000]}]
true