Prolog 序言座位约束

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

我必须在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

我尝试了以下方法来解决此问题,但出现了错误:错误:键入错误:
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.