Skip to content

导航菜单

切换导航 Sign in

搜索或跳转到...

搜索代码、仓库、用户、议题、pull requests...

搜索 清除 搜索语法提示

提供反馈

我们会阅读每一条反馈,并认真对待您的意见。 包括我的电子邮件地址,以便我可以联系 取消 提交反馈

保存的搜索

使用保存的搜索可以更快地过滤您的结果

名称 查询 要查看所有可用的限定符,请参阅我们的 文档。 取消 创建保存的搜索 Sign in Sign up 重置焦点 您在另一个选项卡或窗口中登录。 重新加载 以刷新您的会话。 您在另一个选项卡或窗口中注销。 重新加载 以刷新您的会话。 您在另一个选项卡或窗口中切换了帐户。 重新加载 以刷新您的会话。 关闭警报 {{ message }} bobschrag / **clolog ** 公开

全功能逻辑编程(又名 “Prolog”),嵌入在 Clojure 中/可从 Clojure 调用,并支持对 Clojure 的调用。 在 LogLisp、Lisp Machine Prolog 和 Franz Inc. 的 Allegro Prolog 的精神下,有一些额外的优点。

许可证

EPL-2.0 license 125 stars 2 forks Branches Tags Activity Star 通知 您必须登录才能更改通知设置

其他导航选项

bobschrag/clolog

main BranchesTags 转到文件 代码

文件夹和文件

名称| 名称| 最后提交的消息| 最后提交日期 ---|---|---|---

最新提交

历史

63 Commits src/clolog| src/clolog test/clolog| test/clolog .gitignore| .gitignore CHANGELOG.md| CHANGELOG.md LICENSE| LICENSE README.md| README.md architecture.md| architecture.md deps.edn| deps.edn docstrings.clj| docstrings.clj 查看所有文件

仓库文件导航

clolog

全功能逻辑编程(又名 “Prolog”),嵌入在 Clojure 中/可从 Clojure 调用,并支持对 Clojure 的调用。 在 LogLisp、Lisp Machine Prolog 和 Franz Inc. 的 Allegro Prolog 的精神下,有一些额外的优点。 强调表达能力和执行透明性,支持快速原型设计、概念验证开发和外循环推理(即,到目前为止不是很快)。

亮点,带示例

(do
  ;; 设置,清除知识库。
  (initialize-prolog)
  ;; 创建单元断言。
  (<- (has-subtype vertebrate mammal))
  ;; 执行查询。
  (? ?x ; 答案模板
    (has-subtype vertebrate ?x) ; 目标。
    )
  )
 [mammal] ; 向量中的答案(可能为空)。
> (? (?a ?b)
   (same [?a 2] [1 ?b]))
[(1 2)]
> (? true (truthy? (+ 1 2)))
[true]
* ?var-bearing 术语统一:`evals-from?`
> (? ?x (evals-from? ?x (+ 1 2)))
[3]
* 副作用:`do`
> (? nil (do (println "Hello")))
Hello
[nil]
> (do (<-- (male laban))
   (? ?y (male ?x) (evals-from? ?y (list '?x))))
[(laban)]
> (do (initialize-prolog) ; 清除知识库。
   (? :nothing (not (Huh?))))
[:nothing]
> (binding [*leash* true]
  (? true (same (->? (+ 0 1)) 1)))
0. Processing query: ((same (->? (+ 0 1)) 1))
 Applied ->? transform
 (evals-from?): Entering (evals-from? ??-0:0 (+ 0 1))
 (evals-from?): Succeeded (evals-from? 1 (+ 0 1))
 (same): Entering (same 1 1)
 (same): Succeeded (same 1 1)
Recorded answer: true
Answer limit reached. ; Because answer template `true` has no ?vars.
[true]
> (? (?a ?b)
   (same [?a 2] [1 ?b]))
[(1 2)]
> (? (?a ?b)
   (different [?a 2] [1 ?b]))
[]
> (? ?y (var ?x))
[?y]
> (? ?x (same ?x 1) (ground ?x))
[1]
> (? true (true))
[true]
(? true (false))
[]
> (? ?x (and (if (false)
        (same ?x :succeed)
        (same ?x :fail))
       (evals-from? ?x :fail)
     (or (true) (false))))
[:fail]
> (do (initialize-prolog)
   (<- (sister laban rebecca))
   (<- (sister rachel leah))
   (? [?sibling ?sister]
     (first (sister ?sibling ?sister))))
 [[laban rebecca]]
> (create-predicate-transform '((if% ?if ?then ?else)
               (if (first ?if) ?then ?else)))
> (binding [*leash* true]
  (? [?sibling ?sister ?x] 
   (if% (sister ?sibling ?sister)
      (evals-from? ?x true)
      (evals-from? ?x false))))
0. Processing query: ((if% (sister ?sibling ?sister) (evals-from? ?x true) (evals-from? ?x false)))
 (if%): Applying logic transform (if% ?if ?then ?else)
 (if): Entering (if (first (sister ?sibling:0 ?sister:0)) (evals-from? ?x:0 true) (evals-from? ?x:0 false))
 (if): Checking 'if' condition (if (first (sister ?sibling:0 ?sister:0)) (evals-from? ?x:0 true) (evals-from? ?x:0 false))
 (if first): Entering first (first (sister ?sibling:0 ?sister:0))
  1. Entering "sister/2": (sister ?sibling:0 ?sister:0)
  1. Matched head (sister laban rebecca): (sister laban rebecca)
  1. Succeeded "sister/2": (sister laban rebecca)
 (if first): Succeeded, cutting (first (sister laban rebecca))
 (if): Taking 'then' branch of (if (first (sister laban rebecca)) (evals-from? ?x:0 true) (evals-from? ?x:0 false))
 (if evals-from?): Entering (evals-from? ?x:0 true)
 (if evals-from?): Succeeded (evals-from? true true)
 (if): Succeeded (if (first (sister laban rebecca)) (evals-from? true true) (evals-from? true false))
Recorded answer: [laban rebecca true]
 (if first): Failed (first (sister ?sibling:0 ?sister:0))
 (if): Failed (if (first (sister ?sibling:0 ?sister:0)) (evals-from? ?x:0 true) (evals-from? ?x:0 false))
0. Exhausted query: ((if% (sister ?sibling ?sister) (evals-from? ?x true) (evals-from? ?x false)))
[[laban rebecca true]]
> (do (<- (false true))
   (? ?x (false ?x)))
[true]
> (do (<- (neg? 3))
   (? true (neg? 3)))
[true]
> (do (<- ("false" true))
   (? ?x ("false" ?x)))
[true]
* 数字
> (do (<- (3 neg?))
   (? ?x (3 ?x)))
[neg?]
* 复杂术语
> (do (initialize-prolog)
   (<- ([treasure] (buried ?x)))
 (? ?r ([treasure] ?r)))
[(buried ?unbound-0)]
> (do (initialize-prolog)
   (<- ([treasure chest] (buried ?x)))
 (? [?r ?thing] ([treasure ?thing] ?r)))
[[(buried ?unbound-0) chest]]
> (do (initialize-prolog)
   (<- (male jacob))
 (? ?pred (?pred jacob)))
[male]
> (do (initialize-prolog)
   (<- (variadic))
   (<- (variadic 1))
   (<- (variadic 1 2))
   (? ?rest (variadic & ?rest)))
[() (1) (1 2)]
> (do (initialize-prolog)
   (<- (variadic-term [1]))
   (<- (variadic-term [1 2]))
 (? ?rest (variadic-term [1 & ?rest])))
[[] [2]]
> (do (initialize-prolog)
   (<- (male jacob))
 (? ?goal ?goal)) ; 告诉我你能证明的一切。
[(male jacob)]
> (do (initialize-prolog)
   (<- (male jacob))
 (? ?goal (unasserted) ?goal)) ; ...根据你目前所知。
[]
> (do (initialize-prolog)
   (<- (sister laban rebecca))
   (<- (sister rachel leah))
   (? true (sister ?_person ?_person)))
[true]
> (? true (sister ? ?))
[true]
> (do (initialize-prolog)
   (<- (male laban))
 (<- (male jacob))
 (binding [*leash* true]
    (? ?x (or (male ?x) (male ?x)))))
0. Processing query: ((or (male ?x) (male ?x)))
 (or): Entering (or (male ?x:0) (male ?x:0))
 1. Entering "male/1": (male laban)
 1. Matched head (male laban): (male laban)
 1. Succeeded "male/1": (male laban)
Recorded answer: laban
 1. Backtracking into "male/1": (male ?x:0)
 1. Succeeded "male/1": (male jacob)
Recorded answer: jacob
 1. Backtracking into "male/1": (male ?x:0)
 1. Failed "male/1": (male ?x:0)
 (or): Backtracking into (or (male ?x:0) (male ?x:0))
 1. Entering "male/1": (male laban)
 1. Matched head (male laban): (male laban)
 1. Succeeded "male/1": (male laban)
Duplicate answer (not recorded): laban
 1. Backtracking into "male/1": (male ?x:0)
 1. Succeeded "male/1": (male jacob)
Duplicate answer (not recorded): jacob
 1. Backtracking into "male/1": (male ?x:0)
 1. Failed "male/1": (male ?x:0)
 (or): Failed (or (male ?x:0) (male ?x:0))
0. Exhausted query: ((or (male ?x) (male ?x)))
[laban jacob]
> (do (initialize-prolog)
   (<- (sister laban rebecca))
   (<- (sister ?x ?y))
   (binding [*leash* true]
    (? [?x ?y] (sister ?x ?y))))
0. Processing query: ((sister ?x ?y))
 1. Entering "sister/2": (sister laban rebecca)
 1. Matched head (sister laban rebecca): (sister laban rebecca)
 1. Succeeded "sister/2": (sister laban rebecca)
Recorded answer: [laban rebecca]
 1. Backtracking into "sister/2": (sister ?x:0 ?y:0)
 1. Succeeded "sister/2": (sister ?x:0 ?y:0)
Recorded subsuming answer (discarded 1 subsumed answer(s)): [?x ?y]
 1. Backtracking into "sister/2": (sister ?x:0 ?y:0)
 1. Failed "sister/2": (sister ?x:0 ?y:0)
0. Exhausted query: ((sister ?x ?y))
[[?x ?y]]
> (do (initialize-prolog)
        (binding [*leash* true]
         (? answer (undefined ?arity-1))))
0. Processing query: ((undefined ?arity-1))
 1. Entering "undefined/1": (undefined ?arity-1:0)
 1. Failed "undefined/1": (undefined ?arity-1:0)
0. Exhausted query: ((undefined ?arity-1))
[]

语法

在下面的产生式规则中,...

: (+ ) :- :- :- | :- (+ ) :- :- (+ * & <?var>) :- | :- | :- | | same | different | var | ground | true | false :- and | or | if | not | first :- truthy? | evals-from? | do : 使用 create-predicate-transform 注册的谓词常量 : 一个谓词,其所有断言(如果有)都来自对 <-... 宏或 assert<-... 函数之一的调用 :- | :- <?var> | :- | :- () | [] :- (* & <?var>) | [* & <?var>] :- 任何支持 Clojure = 的 Clojure 值(因此,不是正则表达式),而不是透明术语