Skip to content

ncaq/prohell

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 

Repository files navigation

title
プログラミング言語prohell

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.rbprelude.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

About

Prolog like programming language

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages