我必须解决Prolog中的以下问题。亚历克斯(Alex),弗雷德(Fred)和简(Jane)是3个 child ,他们用10米长的木板制作了seesaw。它们在木板上标出11个座位位置,每个位置相距一米。座位位置的编号为-5,-4,-3,-2,-1、0、1、2、3、4、5,其中0是中心位置。 Alex,Fred和Jane的体重分别为4、3和2个体重单位。他们很想知道当他们三个都坐在木板上的某个地方时,如何使跷跷板保持平衡,而每个 child 都必须坐在不同的位置。
一个就座位置是Alex,Fred和Jane处于-4、2和5的位置,因为(-4 * 4)+(2 * 3)+(5 * 2)= -16 + 6 + 10 = 0。亚历克斯(Alex),弗雷德(Fred)和简(Jane)的另一个就座位置是-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).
最佳答案
我会使用对称破坏来减少解决方案的数量。
一个简单的对称性是当(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,就像larsman已经指出的那样。使用(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.
再见
关于Prolog座位限制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23910620/