我使用以下失败驱动循环来列出所有内容,而无需使用分号。
happiness(fred,5).
happiness(john,3).
happiness(grace,2).
someGoal(X) :-
happiness(X,Y), write(Y), tab(4), fail.
Run Code Online (Sandbox Code Playgroud)
在查询模式下,我得到了预期的结果
?- someGoal(_).
5 3 2
Run Code Online (Sandbox Code Playgroud)
如何将这些数字插入列表中,而不是将它们写到屏幕上?someGoal由于回溯似乎是隐式的,因此我无法在内部进行处理。
我想知道是否有任何Prolog实现允许在子句中进行左递归.我的直觉是,如果实现使用广度优先目标搜索,它可能支持左递归.但我不太确定.请注意,我并不关心效率.
(ns verbal-arithmetic
(:require
[clojure.core.logic :refer [all run* everyg lvar == membero fresh conde succeed fail conso resto]]
[clojure.core.logic.fd :as fd]))
(comment
"Solving cryptarithmetic puzzle"
" SEND
+ MORE
______
MONEY")
(defn send-more-money-solutions []
(run* [s e n d m o r y]
(fd/in s e n d m o r y (fd/interval 0 9))
(fd/!= s 0)
(fd/!= m 0)
(fd/distinct [s e n d m o r y])
(fd/eq (= (apply + [(* 1000 s) (* 100 e) (* …Run Code Online (Sandbox Code Playgroud) clojure logic-programming clojure-core.logic clpfd cryptarithmetic-puzzle
我正在学习 prolog,我对 prolog 使用矛盾证明的说法感到困惑:
解析证明过程利用了一种被称为“归谬法”的技术:假设要证明的公式是假的,并证明这会导致矛盾,从而证明要证明的公式实际上是正确的。
他们展示了以下证明图(基于前面一节建立的规则和事实):
但如果我倒着读这些步骤,那就是一个简单直接的证明:
/* axiom: tottenham_court_road is connected to leicester_square by northern road */
connected(tottenham_court_road, leicester_square, northern)
/* therefore it's connected to something on some road */
connected(tottenham_court_road, W, L)
/* being connected to something also means it's nearby */
nearby(X,Y):-connected(X,Y,L)
/* Therefore tottenham_court_road is near something */
nearby(tottenham_court_road, W)
Run Code Online (Sandbox Code Playgroud)
这是如何用反证法证明的呢?为什么这是一个比公理链式推理更有用的框架?
clpfd是SWI Prolog中整数的约束编程库.集合中是否有类似的库?如果没有,你知道任何有用的文章来实现这样的库吗?
它可行吗?我正在寻找任何形式的输入,因为我的谷歌搜索没有引起任何兴趣.
编辑:搜索时使用引号可以获得更好的结果(doh!).嗯...很高兴收到反馈意见.
编辑:有一个包含B-Prolog(clpset)的库正是这样做的.
我只是想知道正则表达式是否符合逻辑编程的定义。它是一组规则,给定一组事实,根据查询的方式产生结果。对我来说,这听起来应该属于逻辑编程,但我不确定。
谢谢!
我在大学读了Prolog课程.课程要求我们编写prolog程序.我能够编写简单的程序,但是我发现很难消化复杂的程序.任何建议如何进行或如何研究这个主题?解决这种问题的方法是什么?任何帮助赞赏.谢谢.
我正在做一个主要基于逻辑编程的项目。我已经预先定义了程序用来计算概率的相关规则和事实,然后将这些概率附加到数据中并输入到进一步的机器学习模型中。计算概率的程序可以在序言中轻松定义,例如:
has_lot_work(daniel, 8). %number of lets say urgent tasks
has_lot_work(david, 3).
stress(X, P) :- has_lot_work(X, P2), P is P2 / 100.
to_smoke(X, Prob) :- stress(X, P1), friends(Y, X), influences(Y, X, P2), smokes(Y), Prob is P1 + P2.
to_have_asthma(X, 0.3) :- smokes(X). %30 percent of current smokers get asthma
to_have_asthma(X, Prob) :- to_smoke(X, P2), Prob is P2 * 0.25. %25 percent of smokers-to-be will get asthma
friends(X, Y) :- friend(X, Y).
friends(X, Y) :- friend(Y, X).
influences(X, Y, 0.4) :- friends(X, …Run Code Online (Sandbox Code Playgroud) 我正在努力理解 clp(Z) 和MiniKanren 中使用的另一个关系算术系统之间的功能差异。
特别是,clp(Z) 显然适用于有界域,而 Kiselyov等人。被描述为适用于无界字段。
我尝试使用与无穷大和不确定性相关的各种边缘情况,但除了 Kiselyov等人之外,我无法找到明显的差异。显然不支持区间和负数。
Kiselyov 系统的要点/优点是什么?主要是实现更简单,还是还有更多?
我怀疑 ?Prolog 的主要实现 teyjus 可能有点被遗弃,但是 ?Prolog 是一个迷人的 Prolog,它应该让你使用高阶逻辑、假设推理和其他东西,这就是为什么我尝试使用它。
文件“example.sig”:
sig example.
kind person, language type.
type hans person.
type german, french, italian language.
type grade person -> o.
type take person -> language -> o.
Run Code Online (Sandbox Code Playgroud)
文件“example.mod”:
module example.
(grade P) :- (take P german), (take P french).
(grade P) :- (take P german), (take P italian).
take hans french.
Run Code Online (Sandbox Code Playgroud)
但是,当我编译和加载它时,虽然它似乎可以工作,但假设的推理查询被拒绝:
[example] ?- take X Y.
The answer substitution:
Y = french
X = hans
More solutions (y/n)? y
no (more) …Run Code Online (Sandbox Code Playgroud) prolog ×8
clpfd ×2
clojure ×1
clpz ×1
minikanren ×1
prolog-setof ×1
proof ×1
python ×1
regex ×1
set ×1