我必须在Prolog中解决以下问题。亚历克斯,弗雷德和简是3个孩子,他们用10米长的木板做了seesaw。它们沿着木板标记了11个座位,每个位置相距一米。座位数为-5,-4,-3,-2,-1,0,1,2,3,4,5,其中0为中心位置。亚历克斯,弗雷德和简的重量分别为4,3和2个单位。他们有兴趣知道当他们三个坐在木板的某个地方时,他们如何让跷跷板平衡,每个孩子都必须坐在不同的位置。
由于(-4 * 4)+(2 * 3)+(5 * 2)= -16 + 6 + 10,Alex,Fred和Jane位于-4,2和5位置时,一个座位位置亚历克斯,弗雷德和简的另一个座位是-4,4和2,而另一个是-3,2和3。
我已尝试以下方法解决此问题但收到错误:错误:输入错误:integer' expected, found
[_ G11889,_G11892,_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).
答案 0 :(得分:3)
我会使用对称性破坏来减少解决方案的数量。 简单的对称性是当(A,F,J)是解时,也是(-A,-F,-J)。 所以我们可以限制为J#> = 0,并记住如果J#\ = 0, 然后有一个翻转的解决方案。
所以我们首先开始导入CLP(FD)库:
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 7.1.16)
Copyright (c) 1990-2014 University of Amsterdam, VU Amsterdam
?- use_module(library(clpfd)).
然后我们制定我们的查询,而不是(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.
再见