我是限制性编程的新手.我有一个问题,CLPFD没有像我期望的那样减少域名.这可能很简单.
[A,B] ins 1..5,A*B#=5.
Run Code Online (Sandbox Code Playgroud)
我希望它能将A和B的域减少到
1\/5
Run Code Online (Sandbox Code Playgroud)
但它只是给出了
A in 1..5,
A*B#=5,
B in 1..5.
Run Code Online (Sandbox Code Playgroud)
任何建议,将不胜感激.
将二进制位(例如,可能是0/1的列表)以可逆方式转换为数字的最佳方法是什么.我在swi中编写了一个原生谓词,但有更好的解决方案吗?最好的祝福
这种逻辑编程实际上是在我的命令式编程技巧上跳舞.这是家庭作业,所以请不要给我答案.这就是我所拥有的:
fibo(N,1) :-
N < 2,
!.
fibo(N,R) :-
N1 is N-1,
N2 is N-2,
fibo(N1,R1),
fibo(N2,R2),
R is R1+R2.
Run Code Online (Sandbox Code Playgroud)
我想要制作另一个看起来像这样的功能; fib(N,Value,LastValue).
N是第n个数字,值是返回值.我不明白我怎么能用累积重写这个.而且由于它向后计数,我不知道它在计算任何东西之前如何"知道"最后一个值.:s任何输入表示赞赏.
我有一个使用约束在Sicstus Prolog中编写的程序.我的目标是使用标签/ 2和其他一些方法来获得我的变量的随机实例化.
例:
X #> 2, Y #= 2*X, Z #<10
Run Code Online (Sandbox Code Playgroud)
如果我使用
List = [X,Y,Z],
labeling([], List)
Run Code Online (Sandbox Code Playgroud)
获得的第一个结果将是X = Y = Z = 0.您认为返回X,Y和Z的随机值集的最佳方法是什么?
我是初学者,我正在练习练习.所以我试图在列表中得到给定数字的总和.我想用这个:
my_last(X, [X]).
my_last(X, [_|L]) :- my_last(X, L).
Run Code Online (Sandbox Code Playgroud)
(从这里)
作为我的向导.这是我获得总和的代码:
listsum(X, []).
listsum(X, [H|L]):-
X is H + listsum(X, L).
Run Code Online (Sandbox Code Playgroud)
当我编译它时,它说
practice.pl:3:可评估
listsum(_G139,_G140)不存在
practice.pl:2:单例变量:[X]
然后当我尝试listsum(0, [1,2,3]).它返回false.
我仍然不太了解prolog,并在prolog中列出和递归.
在某些情况下,递归谓词可以是CLP(FD) - 具有谓词转向双向的好处.这种方法有哪些限制?例如,可以进行以下计算 CLP(FD):
Fn: n-th Fibonacci Number
Ln: n-th Lucas Number (starting with 2)
Run Code Online (Sandbox Code Playgroud)
通过这个加倍的递归步骤:
F2n = Fn*Ln
L2n = (5*Fn^2+Ln^2)//2
Run Code Online (Sandbox Code Playgroud)
这个递增的递归步骤:
Fn+1 = (Fn+Ln)//2
Ln+1 = (5*Fn+Ln)//2
Run Code Online (Sandbox Code Playgroud)
传统的Prolog 实现已经从n到Fn工作.这可以转变为CLP(FD)程序,保持快速递归并同时使其双向,例如找出Fn = 377的索引n吗?如果有,怎么样?如果不是为什么?
再见
I #> 0, I #< 10, indomain(I).
Run Code Online (Sandbox Code Playgroud)
以前的代码显然执行以下操作:
I = 1 ;
I = 2 ;
I = 3 ;
I = 4 ;
I = 5 ;
I = 6 ;
I = 7 ;
I = 8 ;
I = 9.
Run Code Online (Sandbox Code Playgroud)
以下代码不起作用(参数未充分实例化):
I #> 0, indomain(I).
Run Code Online (Sandbox Code Playgroud)
现在我明白在这种情况下存在无限数量的可能绑定I,并且CLPFD适用于有限域,顾名思义.
但是我不明白为什么在这种特殊情况下存在这种限制.是不是可以列举从最小到最大规范的可能解决方案,并获得以下内容:
I = 1 ;
I = 2 ;
I = 3 ;
.
.
.
Run Code Online (Sandbox Code Playgroud)
即使存在多个变量的问题,也可以说:
0 #< I, I #< J, label([I,J]).
Run Code Online (Sandbox Code Playgroud)
为什么不可能实现它,以便发生以下行为:
I = 1,
J …Run Code Online (Sandbox Code Playgroud) 有人可以提供一个简单的渠道约束示例吗?
通道约束用于组合约束问题的视点.约束编程手册很好地解释了它是如何工作的以及为什么它有用:
搜索变量可以是其中一个视点的变量,比如X1(这将在下面进一步讨论).随着搜索的进行,传播约束C1从X1中的变量的域中移除值.然后,信道约束可以允许从X2中的变量的域中移除值.使用第二模型C2的约束来传播这些值删除可以从这些变量中移除更多值,并且这些移除可以通过信道约束再次转换回第一视点.最终结果可能是在视点V1内移除的值多于仅由约束C1移除的值,导致搜索减少.
我不明白这是如何实现的.究竟是什么限制,它们在真正的问题中看起来如何?一个简单的例子非常有用.
我已经在Prolog中制作了一个工作广义的动词算术求解器,但它太慢了.运行简单的表达SEND + MORE = MONE Y只需要8分钟.有人可以帮助我让它跑得更快吗?
/* 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) :- findTail(List,H,T), convert(H,HDigit), Num is (HDigit*10+T).
verbalArithmetic(WordList,[H1|Tail1],[H2|Tail2],Word3) :-
validStart(H1), validStart(H2), assign(WordList),
convert([H1|Tail1],Num1),convert([H2|Tail2],Num2), convert(Word3,Num3),
Sum is Num1+Num2, Num3 = Sum.
Run Code Online (Sandbox Code Playgroud) 我正在解决这个问题,但我是Prolog的新手,我不知道该怎么做.
电子板的九个部分具有方形形状,相同的尺寸,每个部分的每个边缘都标有字母和加号或减号.零件应组装成一个完整的板,如下图所示,使公共边具有相同的字母和相反的符号.在Prolog中编写一个计划程序,以便程序将"汇编"作为查询并输出如何组装零件,即确定当前位置的零件的位置和位置,以便它们组合在一起以形成完整的板.

我试过解决它,我写了以下条款:
complement(a,aNeg).
complement(b,bNeg).
complement(c,cNeg).
complement(d,dNeg).
complement(aNeg,a).
complement(bNeg,b).
complement(cNeg,c).
complement(dNeg,d).
% Configuration of boards, (board,left,top,right,bottom)
conf(b1,aNeg,bNeg,c,d).
conf(b2,bNeg,a,d,cNeg).
conf(b3,dNeg,cNeg,b,d).
conf(b4,b,dNeg,cNeg,d).
conf(b5,d,b,cNeg,aNeg).
conf(b6,b,aNeg,dNeg,c).
conf(b7,aNeg,bNeg,c,b).
conf(b8,b,aNeg,cNeg,a).
conf(b9,cNeg,bNeg,a,d).
position(b1,J,A).
position(b2,K,B).
position(b3,L,C).
position(b4,M,D).
position(b5,N,E).
position(b6,O,F).
position(b7,P,G).
position(b8,Q,H).
position(b9,R,I).
assemble([A,B,C,E,D,F,G,H,I,J,K,L,M,N,O,P,Q,R]) :-
Variables=[(A,J),(B,K),(C,L),(D,M),(E,N),(F,O),(G,P),(H,Q),(I,R)],
all_different(Variables),
A in 1..3, B in 1..3, C in 1..3, D in 1..3, E in 1..3,
F in 1..3, G in 1..3, H in 1..3, I in 1..3, J in 1..3,
K in 1..3, L in 1..3, M in 1..3, N in 1..3, …Run Code Online (Sandbox Code Playgroud) clpfd ×10
prolog ×10
constraints ×1
eclipse-clp ×1
fibonacci ×1
list ×1
logic ×1
performance ×1
sum ×1