Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.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-为每次递归运行将head附加到新列表?_Prolog - Fatal编程技术网

Prolog-为每次递归运行将head附加到新列表?

Prolog-为每次递归运行将head附加到新列表?,prolog,Prolog,你好 我目前正在Prolog中开发一种类型的“虚拟商店”,并尝试开发更新过道的功能。然而,鉴于我对Prolog的了解有限,我面临着一些困难 谓词和调用: /*%第一个参数:包含未修改数据的商店(或“旧列表”) %第二个参数:仅仅是一个跟踪我们所处位置的索引/计数器 “递归循环” %第三个参数:我们想要得到的地方的索引。我们不断循环 或者递增,或者递减,直到第二个和第三个 参数相同。 %第四个参数:由于第一个参数是列表列表,因此 参数将包含“内部列表”,该列表将替换另一个内部列表 列表 %第五个参

你好

我目前正在Prolog中开发一种类型的“虚拟商店”,并尝试开发更新过道的功能。然而,鉴于我对Prolog的了解有限,我面临着一些困难

谓词和调用:

/*%第一个参数:包含未修改数据的商店(或“旧列表”)
%第二个参数:仅仅是一个跟踪我们所处位置的索引/计数器
“递归循环”
%第三个参数:我们想要得到的地方的索引。我们不断循环
或者递增,或者递减,直到第二个和第三个
参数相同。
%第四个参数:由于第一个参数是列表列表,因此
参数将包含“内部列表”,该列表将替换另一个内部列表
列表
%第五个参数:商店(或“新列表”)、结果,无论您想要什么
叫它
*/
更新通道([H | T]、当前通道、目标岛、新OBJ、新闻商店):-
当前通道<目标岛,
温度为+1,
附加(新闻商店,H),
更新通道(T、Temp、TARGETAILL、NewObj、新闻商店)。
更新通道([H | T]、当前通道、目标岛、新OBJ、新闻商店):-
当前通道>目标岛,
温度为-1,
附加(新闻商店,H),
更新通道(T、Temp、TARGETAILL、NewObj、新闻商店)。
更新通道([H | T]、当前通道、目标岛、新OBJ、新闻商店):-
现在的通道是塔吉塔岛,
nth0(0,T,诱惑),
追加(NewObj、test、NewShop)。
-商店=[“面包”、“甜甜圈”、“饼干”],
[“啤酒”、“苹果酒”、“果汁”],
[“火腿”、“生肉”、“香肠”],
写(商店),nl,
更新通道(商店、0、1、[“啤酒”、“牛奶”、“果汁”]、新闻商店),
写(新闻商店),nl。
现在,我只得到了指令(失败),所以根本没有走多远(我假设这是因为
append/2
没有像我希望的那样配合)。然而,我想要实现的是:

Shop=[[“面包”、“甜甜圈”、“饼干”],
[“啤酒”、“苹果酒”、“果汁”],
[“火腿”、“生肉”、“香肠”]。
新闻商店=[[“面包”、“甜甜圈”、“饼干”],
[“啤酒”、“牛奶”、“果汁”],
[“火腿”、“生肉”、“香肠”]。
换句话说,我试图循环遍历列表,并为每个递归循环添加列表的“头”,只要我们不在列表中想要的位置。一旦我们达到了这一点,在将
NewObj
添加到列表中(而不是头部,因为它是被替换的)并完成工作之后,我们就基本上出局了


我觉得我错过了一些显而易见的东西,但任何和所有的帮助都将不胜感激

如果我正确解释了您的问题,您希望替换列表中给定索引处的项目:

%replace_at(In,at,With,Replaced)
在([],[u I,[u N,[])处替换。
在([[u|T],I,N,[N|T]):-I=:=0处替换_。
替换([H | T],I,N,[H | T2]):-I>0,I2为I-1,
在(T,I2,N,T2)处更换_。
测试:

?-Shop=[“面包”、“甜甜圈”、“饼干”]、[“啤酒”、“苹果酒”、“果汁”]、[“火腿”、“生肉”、“香肠”],
替换(商店,1,[“啤酒”、“牛奶”、“果汁”,新闻商店),nl,
地图列表(writeln,Shop),nl,地图列表(writeln,NewShop),nl。
[面包、甜甜圈、饼干]
[啤酒、苹果酒、果汁]
[火腿、生肉、香肠]
[面包、甜甜圈、饼干]
[啤酒、牛奶、果汁]
[火腿、生肉、香肠]
商店=[“面包”、“甜甜圈”、“饼干”]、[“啤酒”、“苹果酒”、“果汁”]、[“火腿”、“生肉”、“香肠”],
新闻商店=[“面包”、“甜甜圈”、“饼干”]、[“啤酒”、“牛奶”、“果汁”]、[“火腿”、“生肉”、“香肠”];
错。
提供您想要的输出

列表中的元素本身就是列表在这里并不重要

另一方面,如果您希望在调用中使用两个索引,要指定替换列表列表中
I
th列表(基于0)中的
J
th元素,您可以使用上述谓词两次来完成:

%replace\u at2d(In、AtLine、AtWord、With、Replaced)
在2D(LL、I、J、W、LL2)处更换_:-
第nth0(I,LL,L),%I行
替换(L,J,W,L2)处的_,第%J个字
替换(LL、I、L2、LL2)处的_。
测试:

?-Shop=[“面包”、“甜甜圈”、“饼干”]、[“啤酒”、“苹果酒”、“果汁”]、[“火腿”、“生肉”、“香肠”],
替换2D(商店,1,1,“牛奶”,新闻商店),nl,
地图列表(writeln,Shop),nl,地图列表(writeln,NewShop),nl。
[面包、甜甜圈、饼干]
[啤酒、苹果酒、果汁]
[火腿、生肉、香肠]
[面包、甜甜圈、饼干]
[啤酒、牛奶、果汁]
[火腿、生肉、香肠]
商店=[“面包”、“甜甜圈”、“饼干”]、[“啤酒”、“苹果酒”、“果汁”]、[“火腿”、“生肉”、“香肠”],
新闻商店=[“面包”、“甜甜圈”、“饼干”]、[“啤酒”、“牛奶”、“果汁”]、[“火腿”、“生肉”、“香肠”];
错。

绝对没有正确使用。无论它出现在哪里,它都将使
H
成为合并
新闻商店
子列表的结果。这不是我们想要的。而且,“CurrentRoadways is targetaile”是错误的。[
is/2
]是右侧的算术求值。你想检查是否平等,对吗?然后
=
(“确保左右统一”)或
=:=
(确保左右两边的算术表达式解决相同)@DavidTonhofer绝对不会试图说你错了,但我觉得这与他们的文档相矛盾,即
append/2
append(+List,List)
?除非他们的文档没有记住顺序,否则请尝试以下回复:转发:
append([1,2],[3,4],[5,6]],X)。
gives
X=[1,2,3,4,5,6]。
backwards:
bagof([A,B],append([A,B],[1,2]),[1,2],[1,2],[1,2],[1,2],[2]。
@davidtonhm好的!似乎没有解决这个问题