prolog
v1.2.2
ichiban/prolog
是Go中的嵌入式ISO Prolog解譯器。
database/sql
的Go API序言 | 奧托 | 戈盧阿 | |
---|---|---|---|
語言 | ISO序言 | ECMA腳本 | 盧阿 |
範例 | ?邏輯 | 物件導向 | 物件導向 |
去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 謂詞以及 Prolog 和 DCG 謂詞的 Prologue。
有關指令和內建謂詞,請參閱 Wiki。
1pl
是一個實驗性頂級指令,用於測試預設語言及其對 ISO 標準的遵從性。
您可以使用go install
安裝它:
go install github.com/ichiban/prolog/cmd/1pl@latest
然後,您可以使用1pl
進入頂層:
$(go env GOPATH)/bin/1pl [<file>...]
根據麻省理工學院許可分發。請參閱LICENSE
以了解更多資訊。
有關架構詳細信息,請參閱ARCHITECTURE.md
。
我們謹向以下個人對本計畫的貢獻表示感謝:
我們感謝參與該專案的每個人的支持和貢獻。 Arigatou gozaimasu!