Prolog 序言座位约束
我必须在Prolog中解决以下问题。亚历克斯、弗雷德和简是三个孩子,他们用一块10米长的木板做了一个玩具。他们沿着木板标出了11个座位,每个座位间隔一米。座位编号为-5、-4、-3、-2、-1、0、1、2、3、4、5,其中0为中心位置。亚历克斯、弗雷德和简的体重分别为4、3和2个重量单位。他们很想知道,当他们三个都坐在木板上的某个地方,每个孩子都必须坐在不同的位置时,如何让跷跷板保持平衡 一个座位是Alex、Fred和Jane在-4、2和5的位置,因为(-4*4)+(2*3)+(5*2)=-16+6+10=0。亚历克斯、弗雷德和简的另一个座位是-4、4和2,还有一个是-3、2和3 我尝试了以下方法来解决此问题,但出现了错误:错误:键入错误:Prolog 序言座位约束,prolog,clpfd,Prolog,Clpfd,我必须在Prolog中解决以下问题。亚历克斯、弗雷德和简是三个孩子,他们用一块10米长的木板做了一个玩具。他们沿着木板标出了11个座位,每个座位间隔一米。座位编号为-5、-4、-3、-2、-1、0、1、2、3、4、5,其中0为中心位置。亚历克斯、弗雷德和简的体重分别为4、3和2个重量单位。他们很想知道,当他们三个都坐在木板上的某个地方,每个孩子都必须坐在不同的位置时,如何让跷跷板保持平衡 一个座位是Alex、Fred和Jane在-4、2和5的位置,因为(-4*4)+(2*3)+(5*2)=-16
integer'应为,已找到
[\u G11889、\u G11892、\u G11895]'
谁能帮我解释一下我哪里出错了/怎么做
非常感谢
:-use_module(library(clpfd)).
find(Seats):-
Seats=[Alex, Fred, Jane],
Seats in -5..5,
all_different(Seats),
(Alex*4+Fred*3+Jane*2)#=0, % I am not sure about this line
labeling([],Seats).
我会使用对称性破缺来减少解的数量。 简单的对称性是指(A,F,J)是解,所以(-A,-F,-J)也是解。 所以我们可以限制为J#>=0,记住如果J#\=0, 然后是一个翻转的解决方案 因此,我们首先导入CLP(FD)库: 然后我们制定我们的查询,而不是(in)/2 使用(ins)/2,正如拉斯曼已经指出的那样。(in)/2原因的使用 还有错误消息。周围不需要括号 线性形式。因此,我们得到:
?- Seats=[Alex, Fred, Jane],
Seats ins -5..5,
Jane #> 0,
all_different(Seats),
Alex*4+Fred*3+Jane*2 #= 0,
label(Seats),
write(Seats), nl, fail; true.
[-4,2,5]
[-4,4,2]
[-3,2,3]
[-2,0,4]
[-2,2,1]
[-1,-2,5]
[-1,0,2]
[0,-2,3]
[1,-4,4]
true.
对于不同的权重,您可以得到唯一的解决方案,如果
你要求没有人坐在中间。
跷跷板重量15、10和6起作用。这是
在运行示例中,请注意修改的(ins)/2语句:
?- Seats=[Alex, Fred, Jane],
Seats ins -5.. -1\/1..5,
Jane #> 0,
all_different(Seats),
Alex*15+Fred*10+Jane*6 #= 0,
label(Seats),
write(Seats), nl, fail; true.
[-4,3,5]
true.
Bye
中的约束单个变量。使用ins
。您的约束行(Alex*4+Fred*3+Jane*2)#=0
在我看来很好。
?- Seats=[Alex, Fred, Jane],
Seats ins -5.. -1\/1..5,
Jane #> 0,
all_different(Seats),
Alex*15+Fred*10+Jane*6 #= 0,
label(Seats),
write(Seats), nl, fail; true.
[-4,3,5]
true.