标签: logic-programming

Prolog中的广度优先

在Prolog中使用广度优先于默认深度优先搜索方案的一般思路是什么?

没有采取无限的分支?

在Prolog中有没有使用广度优先的一般方法?我一直在谷歌搜索,我没有找到太多有用的新手信息.

breadth-first-search prolog logic-programming

9
推荐指数
2
解决办法
9484
查看次数

函数返回"无解"而不是"无"

我有一个表示谓词逻辑公式的标准数据类型.表示析出的自然演绎消除规则的函数可能如下所示:

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

functional-programming logic-programming curry maybe

9
推荐指数
1
解决办法
359
查看次数

Lua中的逻辑编程?

有没有办法 在Lua中进行逻辑编程(想想Prolog)?

特别是:有没有用于逻辑编程的Lua模块(miniKanren实现将是最好的,但并不是严格要求的)?因为我找不到任何[1].如果没有,是否有任何已知的(最好尝试过)如何在Lua中进行逻辑编程?

另外:有没有人试图在Lua中做类似逻辑编程的事情?


[1]到目前为止,我发现只有博客文章提到在Metalua中写一个的可能性,但我宁愿看到一个兼容标准的Lua.

lua logic-programming

9
推荐指数
1
解决办法
2265
查看次数

逻辑变量支持.NET

我正在寻找一个允许我在F#中使用逻辑变量的库/程序集.我想避免在实现所需的union-find数据结构,统一代码等方面重新发明轮子.

我找到了Prolog.NET,但手册有点稀疏.我不想要一个完整的Prolog实现,但只有它对逻辑变量和手册的处理在这方面是缺乏的.

这是我希望能够做到的:

  • 声明新的逻辑变量
  • 绑定log.var.到一个术语(优选地,该库允许完整的Herbrand条款)
  • 均衡log.vars.(即统一)
  • log.vars的荟萃处理.(它是否是地面的?其他log.vars.它已被均衡了吗?...)
  • 最终,图书馆甚至支持匹配,即片面统一.

有谁知道任何完成所有这些的库,或者至少可以用作起点的库?

.net logic f# logic-programming

8
推荐指数
1
解决办法
772
查看次数

整个Haskell会成为Curry的一部分吗?

我在维基百科上找到了Curry.它说库里几乎是一个超集,但不是因为缺乏某些东西.

我希望看到它支持整个Haskell.他们是否计划将Haskell作为Curry的一部分实施?

haskell logic-programming curry

8
推荐指数
0
解决办法
494
查看次数

Prolog的纯度谓词使用不纯的原语

我知道这一点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)

prolog logic-programming logical-purity

8
推荐指数
2
解决办法
337
查看次数

全局启用发生检查时,Prolog 是否需要 GC?

据我所知,通过健全的统一,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

8
推荐指数
1
解决办法
195
查看次数

Clojure的`core.logic`中的目标排序

以下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)

是否有一般解决方案或通常的做法来避免这个问题?

clojure logic-programming clojure-core.logic

7
推荐指数
2
解决办法
457
查看次数

如何阻止prolog无限地检查不可能的解决方案?

假设以下程序:

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

7
推荐指数
1
解决办法
596
查看次数

Prolog 中的术语“函子”与范畴论中的术语有任何关系吗?

我开始学习 Prolog,我刚刚读到结构开头的原子通常称为函子

我还熟悉范畴论和函数式编程中的术语函子。

所以我的问题是,Prolog 中函子一词的选择对范畴论有什么影响吗?Prolog 中的函子是一种变换吗?或者这个名字的选择仅仅是巧合?

非常感谢!

functional-programming prolog logic-programming functor category-theory

7
推荐指数
1
解决办法
228
查看次数