Tag: 序言

序言约束处理:包装正方形

我试图解决序言中的约束处理问题。 我需要在10×10的网格中包装5×5,4×4,3×3和2×2的4个方格。 它们可能不重叠。 我的variables是这样的: Name: SqX(i), i=1..10, domain: 1..10 其中X是5,4,3或2.索引i表示行,即域在网格中的列。 我的第一个约束试图定义正方形的宽度和高度。 我这样制定: Constraint: SqX(i) > SqX(j)-X /\ i>jX, range: i>0 /\ j>0 因此,可能的点被限制在彼此的X行和列之内。 然而,Prolog停止这些约束,并给出以下结果: Adding constraint "(Sq5_I > Sq5_J-5) /\ (I>J-5)" for values: I=1, J=1, I=1, J=2, I=1, J=3, I=1, J=4, I=1, J=5, I=1, J=6, =======================[ End Solutions ]======================= 所以它停在那里,甚至没有检查其他广场。 我的约束很可能太紧张,但我不明白为什么或如何。 有什么build议么?

前向链与后向链

对方有什么不好的地方呢? 我理解他们所做的理论,但他们在实际应用中的局限性和能力又是什么? 我正在考虑Drools vs一个新的AI项目的java prolog,但是打开其他的build议。 推理复杂关系数据集或替代方法的一些stream行方法是什么?

Haskell与Prolog的比较

在Prolog中比在Haskell中更好的解决什么样的问题? 这两种语言的主要区别是什么? 编辑 是否有一个Haskell库(一种逻辑解算器),可以模仿Prolog的function?

'如果'在序言?

可能是一个愚蠢的问题,但我无法find任何地方的任何文件。 有没有办法做一个如果序言,例如,如果一个variables是0,然后做一些行动(写入文本到terminal)。 别的甚至不需要,但我找不到if的任何实现。

归因variables:库接口/实现/可移植性

当我最近浏览一些序言相关的问题时,我偶然发现了@mat的这个答案,以问题如何在Prolog中直接访问相邻节点来表示有向循环图 。 到目前为止,我对Prolog中归因variables的个人经验非常有限。 但@mat给出的用例引发了我的兴趣。 所以我试着用它来回答另一个问题, 用约束逻辑编程sorting列表 。 首先,好消息是:我第一次使用属性variables就像我想要的那样。 然后,不是那么好的消息:当我通过回答发布时,我意识到在Prolog中有几个API和实现的归因variables。 我觉得我在这里头…特别是我想知道以下几点: 什么API在广泛使用? 到目前为止,我发现了两个:SICStus和SWI。 不同的归因variables实现提供哪些function? 同样的? 或者一个包含另一个? 语义有差异吗? 那实际的实现呢? 比别人更有效率吗? 可以(或正在)使用属性variables的可移植性问题? 很多问号,在这里…请分享你的经验/立场? 先谢谢你! 编辑2015-04-22 这是上面提到的答案的代码片段: init_att_var(X,Z) :- put_attr(Z,value,X). get_att_value(Var,Value) :- get_attr(Var,value,Value). 到目前为止,我只“使用” put_attr/3和get_attr/3 ,但是—根据SICStus Prolog关于归因variables的文档— SICStus提供了put_attr/2和get_attr/2 。 所以即使这个非常浅的用例也 需要一些仿真层(单向或者其他)。

比较SQL和Prolog

我已经开始学习Prolog,并想知道与SQL语言的理论差异。 例如: 两者都是声明性语言 都支持事实驱动的知识库 都支持问题式的数据检索 两者都支持函数依赖关系 还有更多的共同点吗? 任何显着的差异?

逻辑编程和function编程的区别

我一直在阅读许多文章,试图理解function和逻辑编程之间的区别,但迄今为止唯一能够做出的演绎是逻辑编程通过mathexpression式来定义程序。 但是这样的事情与逻辑编程没有关系。 我真的很感激function和逻辑编程之间的区别。

在Prolog中分离列表

我很难理解如何让我的代码显示由偶数和奇数组成的分隔列表。 我甚至不确定我缺乏什么理解。 我对这个语言很陌生,必须把它用于学校。 我的命令和function的头脑不会让我知道这是怎么回事这个笑话。 现在,不,我不是要你做我的功课! 我只是要求你帮助我看看我缺乏了解。 我也查了类似的答案,但我不能将它们转换为我应该写这个函数的方式。 请再次,不要因为我以前通常被打击而使我受伤。 请帮我看看我的理解缺乏。 不要只是给我的答案和代码片段,而不是解释它。 这里是: is_even(H) :- 0 is mod(H, 2). segregate(List, Even, Odd) :- segregator(List, Even, Odd). segregator([], [], []). segregator([H|T], E, O) :- is_even(H), % I feel here is where I am supposed to build the list, % but I have no clue how since Even or […]

二叉树T的叶节点中的值的列表

List是二叉树的叶节点值的列表,我想弄清楚如何输出。 这是给我所有的节点,但我只需要叶子。 lea(nil,[]). lea(t(X,L,R),[X|L]) :- lea(L,L1), lea(R,L2), append(L1,L2,L). 运行这个给我: ?- lea(t(a,t(b,t(d,nil,nil),t(e,nil,nil)),t(c,nil,t(f,t(g,nil,nil),nil))), List). List = [a, b, d, e, c, f, g] 但是我需要 List = [d, e,g] 可能吗。

在Prolog中更快地实现了口头运算

我已经在Prolog中做了一个可操作的广义的语言algorithm求解器,但是它太慢了。 只需要8分钟即可运行简单的expression式SEND + MORE = MONE Y.有人可以帮助我使其运行得更快吗? /* verbalArithmetic(List,Word1,Word2,Word3) where List is the list of all possible letters in the words. The SEND+MORE = MONEY expression would then be represented as verbalArithmetic([S,E,N,D,M,O,R,Y],[S,E,N,D],[M,O,R,E],[M,O,N,E,Y]). */ validDigit(X) :- member(X,[0,1,2,3,4,5,6,7,8,9]). validStart(X) :- member(X,[1,2,3,4,5,6,7,8,9]). assign([H|[]]) :- validDigit(H). assign([H|Tail]) :- validDigit(H), assign(Tail), fd_all_different([H|Tail]). findTail(List,H,T) :- append(H,[T],List). convert([T],T) :- validDigit(T). convert(List,Num) :- […]