Prolog 使用“创建浮动列表”;类型错误:`character';应为0.0';(a)";
我试图用以下代码初始化列表[0.0,0.17,0.33,0.5,0.67,0.83,1]:Prolog 使用“创建浮动列表”;类型错误:`character';应为0.0';(a)";,prolog,Prolog,我试图用以下代码初始化列表[0.0,0.17,0.33,0.5,0.67,0.83,1]: #!/usr/bin/swipl floorsMax( 6 ). floorLocations( _, 0, TmpLocs, Locs ) :- Locs is [0.0 | TmpLocs ]. floorLocations( FloorsMax, FloorsCount, TmpLocs, Locs ) :- Loc is FloorsCount / FloorsMax,
#!/usr/bin/swipl
floorsMax( 6 ).
floorLocations( _, 0, TmpLocs, Locs ) :-
Locs is [0.0 | TmpLocs ].
floorLocations( FloorsMax, FloorsCount, TmpLocs, Locs ) :-
Loc is FloorsCount / FloorsMax,
Count is FloorsCount - 1,
floorLocations( FloorsMax, Count, [Loc|TmpLocs], Locs ).
floorLocations( Locs ) :-
floorsMax( FloorsMax ),
trace,
floorLocations( FloorsMax, FloorsMax, [], Locs ).
执行步骤如下:
?- floorLocations(Fl).
Call: (11) floorLocations(6, 6, [], _2732) ? creep
Call: (12) _3158 is 6/6 ? creep
Exit: (12) 1 is 6/6 ? creep
Call: (12) _3264 is 6+ -1 ? creep
Exit: (12) 5 is 6+ -1 ? creep
Call: (12) floorLocations(6, 5, [1], _2732) ? creep
Call: (13) _3410 is 5/6 ? creep
Exit: (13) 0.8333333333333334 is 5/6 ? creep
Call: (13) _3522 is 5+ -1 ? creep
Exit: (13) 4 is 5+ -1 ? creep
Call: (13) floorLocations(6, 4, [0.8333333333333334, 1], _2732) ? creep
Call: (14) _3668 is 4/6 ? creep
Exit: (14) 0.6666666666666666 is 4/6 ? creep
Call: (14) _3780 is 4+ -1 ? creep
Exit: (14) 3 is 4+ -1 ? creep
Call: (14) floorLocations(6, 3, [0.6666666666666666, 0.8333333333333334, 1], _2732) ? creep
Call: (15) _3926 is 3/6 ? creep
Exit: (15) 0.5 is 3/6 ? creep
Call: (15) _4038 is 3+ -1 ? creep
Exit: (15) 2 is 3+ -1 ? creep
Call: (15) floorLocations(6, 2, [0.5, 0.6666666666666666, 0.8333333333333334, 1], _2732) ? creep
Call: (16) _4184 is 2/6 ? creep
Exit: (16) 0.3333333333333333 is 2/6 ? creep
Call: (16) _4296 is 2+ -1 ? creep
Exit: (16) 1 is 2+ -1 ? creep
Call: (16) floorLocations(6, 1, [0.3333333333333333, 0.5, 0.6666666666666666, 0.8333333333333334, 1], _2732) ? creep
Call: (17) _4442 is 1/6 ? creep
Exit: (17) 0.16666666666666666 is 1/6 ? creep
Call: (17) _4554 is 1+ -1 ? creep
Exit: (17) 0 is 1+ -1 ? creep
Call: (17) floorLocations(6, 0, [0.16666666666666666, 0.3333333333333333, 0.5, 0.6666666666666666, 0.8333333333333334, 1], _2732) ? creep
Call: (18) _2732 is [0.0, 0.16666666666666666, 0.3333333333333333, 0.5, 0.6666666666666666, 0.8333333333333334, 1] ? creep
ERROR: Type error: `character' expected, found `0.0' (a float)
ERROR: In:
ERROR: [18] _214 is [0.0,0.16666666666666666|...]
ERROR: [17] floorLocations(6,0,[0.16666666666666666,0.3333333333333333|...],_258) at /home/aubin/Dev/IA/prolog-Ascenseur/Stimulus.pl:7
ERROR: [16] floorLocations(6,1,[0.3333333333333333,0.5|...],_300) at /home/aubin/Dev/IA/prolog-Ascenseur/Stimulus.pl:11
ERROR: [15] floorLocations(6,2,[0.5,0.6666666666666666|...],_342) at /home/aubin/Dev/IA/prolog-Ascenseur/Stimulus.pl:11
ERROR: [14] floorLocations(6,3,[0.6666666666666666,0.8333333333333334|...],_384) at /home/aubin/Dev/IA/prolog-Ascenseur/Stimulus.pl:11
ERROR: [13] floorLocations(6,4,[0.8333333333333334,1],_426) at /home/aubin/Dev/IA/prolog-Ascenseur/Stimulus.pl:11
ERROR: [12] floorLocations(6,5,[1],_468) at /home/aubin/Dev/IA/prolog-Ascenseur/Stimulus.pl:11
ERROR: [11] floorLocations(6,6,[],_504) at /home/aubin/Dev/IA/prolog-Ascenseur/Stimulus.pl:11
ERROR: [10] floorLocations(_528) at /home/aubin/Dev/IA/prolog-Ascenseur/Stimulus.pl:15
ERROR: [9] toplevel_call(user:user: ...) at /usr/lib/swi-prolog/boot/toplevel.pl:1113
Exception...
跟踪良好,中间结果如预期,但最终分配不起作用,为什么?
在阅读《好建议》之后进行编辑,这里有一个解决方案(带有一个剪切,为纯粹主义者感到抱歉):
这是因为
is/2
用于计算数学表达式,但[0.0|TmpLocs]
不是数学表达式。要修复代码,您需要编写以下内容:
floorLocations( _, 0, TmpLocs, [0.0 | TmpLocs ] ).
而不是
floorLocations( _, 0, TmpLocs, Locs ) :-
Locs is [0.0 | TmpLocs ].
这样,您将拥有整个列表。
此外,您的代码也有问题。如果你问第一个答案,你会得到你期望的答案
Fl = [0.0, 0.16666666666666666, 0.3333333333333333, 0.5, 0.6666666666666666, 0.8333333333333334, 1]
但有一个选择点是开放的,有更多的解决方案可用。如果我们要求第二个解决方案会发生什么?程序将永远循环,并最终完成内存。这是因为
floorscont
的值为负值,因此不会终止重复。要解决此问题,只需在第二个floorLocations/4
子句中添加floorscont>0
作为第一个检查项即可。谢谢!我学习序言。每天都有很多信息。。。
Fl = [0.0, 0.16666666666666666, 0.3333333333333333, 0.5, 0.6666666666666666, 0.8333333333333334, 1]