标签: clpfd

SWI-Prolog CLPFD

我是限制性编程的新手.我有一个问题,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)

任何建议,将不胜感激.

prolog clpfd

10
推荐指数
1
解决办法
376
查看次数

可逆的"二进制到数字"谓词

将二进制位(例如,可能是0/1的列表)以可逆方式转换为数字的最佳方法是什么.我在swi中编写了一个原生谓词,但有更好的解决方案吗?最好的祝福

prolog clpfd

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

序言; 试着让斐波那契更有效?

这种逻辑编程实际上是在我的命令式编程技巧上跳舞.这是家庭作业,所以请不要给我答案.这就是我所拥有的:

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任何输入表示赞赏.

prolog fibonacci clpfd

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

Prolog:随机标签

我有一个使用约束在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的随机值集的最佳方法是什么?

prolog sicstus-prolog clpfd

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

如何在prolog中获得给定数字的总和?

我是初学者,我正在练习练习.所以我试图在列表中得到给定数字的总和.我想用这个:

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中列出和递归.

sum list prolog clpfd

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

CLP(FD)-ing Fibonacci Lukas数字的同时递归可能吗?

在某些情况下,递归谓词可以是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吗?如果有,怎么样?如果不是为什么?

再见

prolog clpfd

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

CLPFD和无限可数域

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)

prolog clpfd

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

示例通道约束ECLiPSe

有人可以提供一个简单的渠道约束示例吗?

通道约束用于组合约束问题的视点.约束编程手册很好地解释了它是如何工作的以及为什么它有用:

搜索变量可以是其中一个视点的变量,比如X1(这将在下面进一步讨论).随着搜索的进行,传播约束C1从X1中的变量的域中移除值.然后,信道约束可以允许从X2中的变量的域中移除值.使用第二模型C2的约束来传播这些值删除可以从这些变量中移除更多值,并且这些移除可以通过信道约束再次转换回第一视点.最终结果可能是在视点V1内移除的值多于仅由约束C1移除的值,导致搜索减少.

我不明白这是如何实现的.究竟是什么限制,它们在真正的问题中看起来如何?一个简单的例子非常有用.

constraints prolog constraint-programming clpfd eclipse-clp

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

在Prolog中更快地实现口头算术

我已经在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)

performance logic prolog clpfd cryptarithmetic-puzzle

8
推荐指数
3
解决办法
3075
查看次数

董事会大会有约束

我正在解决这个问题,但我是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)

prolog clpfd

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