prolog
v1.2.2
ichiban/prolog
Goに埋め込み可能なISO Prologインタープリターです。
database/sql
のような Go APIプロローグ | オットー | ゴルア | |
---|---|---|---|
言語 | ISO プロローグ | ECMA スクリプト | ルア |
パラダイム | ?論理 | オブジェクト指向 | オブジェクト指向 |
Go API | ? database/sql のようなもの | オリジナル | オリジナル |
宣言的 | ✅ | ||
サンドボックス化 | ✅ | ✅ |
go get -u github.com/ichiban/prolog
p := prolog . New ( os . Stdin , os . Stdout ) // Or `prolog.New(nil, nil)` if you don't need user_input/user_output.
または、組み込み述語のないサンドボックス インタープリターが必要な場合は、次のようにします。
// See examples/sandboxing/main.go for details.
p := new (prolog. Interpreter )
if err := p . Exec ( `
human(socrates). % This is a fact.
mortal(X) :- human(X). % This is a rule.
` ); err != nil {
panic ( err )
}
database/sql
と同様に、プレースホルダー?
使用できます。 Go データを Prolog データとして挿入します。
if err := p . Exec ( `human(?).` , "socrates" ); err != nil { // Same as p.Exec(`human("socrates").`)
panic ( err )
}
sols , err := p . Query ( `mortal(?).` , "socrates" ) // Same as p.Query(`mortal("socrates").`)
if err != nil {
panic ( err )
}
defer sols . Close ()
// Iterates over solutions.
for sols . Next () {
fmt . Printf ( "Yes. n " ) // ==> Yes.
}
// Check if an error occurred while querying.
if err := sols . Err (); err != nil {
panic ( err )
}
または、各ソリューションの変数値をクエリする場合は、次のようにします。
sols , err := p . Query ( `mortal(Who).` )
if err != nil {
panic ( err )
}
defer sols . Close ()
// Iterates over solutions.
for sols . Next () {
// Prepare a struct with fields which name corresponds with a variable in the query.
var s struct {
Who string
}
if err := sols . Scan ( & s ); err != nil {
panic ( err )
}
fmt . Printf ( "Who = %s n " , s . Who ) // ==> Who = socrates
}
// Check if an error occurred while querying.
if err := sols . Err (); err != nil {
panic ( err )
}
ichiban/prolog
ISO 標準に準拠しており、ISO 述語に加えて、Prologue for Prolog および DCG 述語が付属しています。
ディレクティブと組み込み述語については、Wiki を参照してください。
1pl
は、デフォルト言語と ISO 標準への準拠をテストするための実験的なトップレベル コマンドです。
go install
でインストールできます。
go install github.com/ichiban/prolog/cmd/1pl@latest
次に、 1pl
でトップレベルに入ることができます。
$(go env GOPATH)/bin/1pl [<file>...]
MIT ライセンスに基づいて配布されます。詳細については、 LICENSE
を参照してください。
アーキテクチャの詳細については、 ARCHITECTURE.md
参照してください。
このプロジェクトへの貢献に対し、以下の方々に感謝の意を表したいと思います。
このプロジェクトに関わってくださった皆様のご支援とご貢献に感謝いたします。ありがとうございます!