在Prolog中使用广度优先于默认深度优先搜索方案的一般思路是什么?
没有采取无限的分支?
在Prolog中有没有使用广度优先的一般方法?我一直在谷歌搜索,我没有找到太多有用的新手信息.
我有一个表示谓词逻辑公式的标准数据类型.表示析出的自然演绎消除规则的函数可能如下所示:
d_el p q =
if p =: (Dis r s) && q =: (Neg r) then Just s else
if q =: (Dis r s) && p =: (Neg r) then Just s else
Nothing where r,s free
x =: y = (x =:= y) == success
Run Code Online (Sandbox Code Playgroud)
在统一失败时,该函数不返回Nothing,而是返回以下解决方案PACKS:
logic> d_el (Dis Bot Top) (Not Bot)
Result: Just Top
More Solutions? [Y(es)/n(o)/a(ll)] n
logic> d_el (Dis Bot Top) (Not Top)
No more solutions.
Run Code Online (Sandbox Code Playgroud)
我错过了什么,为什么在统一失败时不el评价Nothing?
有没有办法 在Lua中进行逻辑编程(想想Prolog)?
特别是:有没有用于逻辑编程的Lua模块(miniKanren实现将是最好的,但并不是严格要求的)?因为我找不到任何[1].如果没有,是否有任何已知的(最好尝试过)如何在Lua中进行逻辑编程?
另外:有没有人试图在Lua中做类似逻辑编程的事情?
[1]到目前为止,我发现只有博客文章提到在Metalua中写一个的可能性,但我宁愿看到一个兼容标准的Lua.
我正在寻找一个允许我在F#中使用逻辑变量的库/程序集.我想避免在实现所需的union-find数据结构,统一代码等方面重新发明轮子.
我找到了Prolog.NET,但手册有点稀疏.我不想要一个完整的Prolog实现,但只有它对逻辑变量和手册的处理在这方面是缺乏的.
这是我希望能够做到的:
有谁知道任何完成所有这些的库,或者至少可以用作起点的库?
我在维基百科上找到了Curry.它说库里几乎是一个超集,但不是因为缺乏某些东西.
我希望看到它支持整个Haskell.他们是否计划将Haskell作为Curry的一部分实施?
我知道这一点var/1,nonvar/1并且!/0是不纯的基元,但它们的使用是否会使每个使用它们的程序都不纯净?
我写了下面的谓词plus/3,表现得好像是纯粹的,或者至少是我声称的那样.谓词是示范性的,不是为了提高效率.
% nat(X) is true if X is a natural number
nat(0).
nat(X):- nonvar(X), !, X > 0.
nat(X):- nat(X1), X is X1 + 1.
% plus(A, B, C) is true if A,B and C are natural numbers and A+B=C
plus(A, B, C):-
nat(A),
(nonvar(C), C < A, !, false ; true),
plus_(B, A, C).
plus_(A, B, C):-
nat(A),
(nonvar(C), C < A, !, false ; true),
C1 is …Run Code Online (Sandbox Code Playgroud) 据我所知,通过健全的统一,SLD 解析不应该创建循环数据结构(这是正确的吗?)
如果是这样,理论上可以以不需要垃圾收集 (GC) 的方式实现 Prolog。但话又说回来,一个人可能不会。
对于基于 WAM 的 Prolog 实现来说,这是真的吗?
SWI-Prolog 是这样吗?(我相信它不是基于 WAM 的)当发生检查全局启用时,在 SWI-Prolog 中禁用 GC 是否安全?
具体来说:
:- set_prolog_flag(occurs_check, true).
:- set_prolog_flag(gc, false). /* is this safe? */
Run Code Online (Sandbox Code Playgroud) prolog logic-programming swi-prolog warren-abstract-machine occurs-check
以下Clojure代码用于core.logic在两个不同的顺序中解决具有相同目标的相同逻辑问题.这种订购选择导致一个快速完成而另一个挂起.
(use `clojure.core.logic)
;; Runs quickly. Prints (1 2 3).
(clojure.pprint/pprint (run* [q] (fresh [x] (== x [1,2,3])
(membero q x))))
;; Hangs
(clojure.pprint/pprint (run* [q] (fresh [x] (membero q x)
(== x [1,2,3]))))
Run Code Online (Sandbox Code Playgroud)
是否有一般解决方案或通常的做法来避免这个问题?
假设以下程序:
nat(0).
nat(s(N)) :- nat(N).
/* 0+b=b */
plus(0,B,B) :- nat(B).
/* (a+1)+b = c iff a+(b+1)=c */
plus(s(A),B,C) :- plus(A,s(B),C).
Run Code Online (Sandbox Code Playgroud)
它适用于添加两个数字,但是当我尝试查询以下类型时:
plus(Z,Z,s(0)).
Run Code Online (Sandbox Code Playgroud)
它继续搜索可能的值Z很长时间后应该很明显没有解决方案(即Z>s(0))
我熟悉cut(!)运算符,我的直觉说解决方案与它有关,我只是不确定如何在这种情况下使用它.
prolog logic-programming backtracking successor-arithmetics failure-slice
我开始学习 Prolog,我刚刚读到结构开头的原子通常称为函子。
我还熟悉范畴论和函数式编程中的术语函子。
所以我的问题是,Prolog 中函子一词的选择对范畴论有什么影响吗?Prolog 中的函子是一种变换吗?或者这个名字的选择仅仅是巧合?
非常感谢!
functional-programming prolog logic-programming functor category-theory
prolog ×5
curry ×2
.net ×1
backtracking ×1
clojure ×1
f# ×1
functor ×1
haskell ×1
logic ×1
lua ×1
maybe ×1
occurs-check ×1
swi-prolog ×1