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!