Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog 使用“创建浮动列表”;类型错误:`character';应为0.0';(a)";_Prolog - Fatal编程技术网

Prolog 使用“创建浮动列表”;类型错误:`character';应为0.0';(a)";

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,

我试图用以下代码初始化列表[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,
    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]