prolog - 递归变量赋值
问题描述
鉴于这种:
useAdd(List, What) :-
addToList(List, What, New),
reverseList(New, T),
write("done "),
write(T), nl, !.
addToList(List, What, [ What | List]).
reverseList([], List) :- write(List), nl.
reverseList([H | Old], []) :- reverseList(Old, [ H ]).
reverseList([ H | Old], New) :- reverseList(Old, [ H | New]).
为什么会发生这种情况(在 swipl 中)?
?- useAdd([42, 100, ok], hello).
[ok,100,42,hello]
done []
true.
显然分配到New
inuseAdd
相当于一些东西,因为正确的列表被传递给reverseList
. 但是,与 不同的是New
,T
inuseAdd
是空的。
- 这两个任务有什么不同?为什么一个有效而另一个无效?
- 如何将反向列表放入
T
inuseAdd
?
解决方案
您将reverseList/2
使用 T
定义为反向列表的尾部。反向列表是在最深的递归级别构建和打印的,然后对该创建的值不做任何事情:
2 ?- reverseList( [1,2,3,4], [0]).
[4,3,2,1,0]
true.
相反,将其作为新的逻辑变量作为第三个参数传入,在调用之间保持不变,最后将其设置为最深层次:
reverseList([], List, T) :- List = T, write(List), nl.
reverseList([H | Old], [], T) :- reverseList(Old, [ H ], T).
reverseList([ H | Old], New, T) :- reverseList(Old, [ H | New], T).
然后调用它reverseList( [1,2,3,4], Newtail, T)
以使您的T
集合处于最深的递归级别:
6 ?- reverseList( [1,2,3,4], [0], T).
[4,3,2,1,0]
T = [4, 3, 2, 1, 0].
定义到处都是,命名很糟糕,它T
可能用于“尾巴”,所以你应该将新参数命名为类似的名称R
,至少暗示它将保存反向列表作为结果的调用。
推荐阅读
- python - flask route 函数将“None”注入 url 并发出两个 GET 请求
- reactjs - 无法访问道具中的“历史”
- php - 使用 nuovo/spreadsheet-reader lib 在 php 中读取 xls 文件
- python - 加载单词向量时在python中解开堆栈下溢
- android - 错误:未找到具有搜索模式的匹配文件:D:\a\1\s\**\*.apk
- scala - 如何在 Play、Java/Scala 环境中运行 ScraPy Spiders?
- java - 自定义firebase单例类以减少android应用程序开发的代码行
- c - 用数字按升序重新排序数字(带前导零)
- wordpress - Wordpress Mailchimp 插件不会显示成功消息
- java - 获取与 Arraylist 匹配的 List 的 Arraylist 中的数据