【发布时间】:2015-05-12 15:10:46
【问题描述】:
我是 prolog 的新手,我正处于解决一个问题的边缘,但是当我尝试退出递归并将列表返回到初始函数时遇到问题。你能帮帮我吗?我整天都在为此苦苦挣扎。谢谢
当我建立列表时,最后会发生以下情况:
这是我的谓词:
depth_first(N, ReturnList) :-
df_real(2:1, N, [2:1], ReturnList).
df_real(_:NextRankC, Size, Q, ReturnList) :-
genInt(Size, Row),
Column is NextRankC + 1,
Rank = Row:Column,
not(list_attack(Rank, Q)),
add(Rank, Q, NewList),
df_real(1:Column, Size, NewList, NewList).
% Recursive Case: Exit when list is full.
df_real(_, N, Q, Newlist) :- length(Q, Length),
N = Length.
调用谓词:
深度优先(4,Q)。
注意:假设genInt/2、add/3 和list_attack/2 工作正常,我的问题最终是它只是删除了我刚刚构建的所有元素并返回了一些变量,而不是 true,它必须返回列表。
我使用时更新
df_real(_:NextRankC, Size, Q, NewList) :-
...
df_real(1:Column, Size, NewList, NewList).
跟踪 - 添加失败,因为 NewList 现在是一个列表,而不是要添加到列表的变量。
【问题讨论】:
-
您的谓词
df_real(_:NextRankC, Size, Q, _) :- ...有一个匿名变量_(未实例化),我假设您想在其中返回您的列表。让它,df_real(_:NextRankC, Size, Q, NewList) :- ...代替。此外,为简洁起见,您的第一个谓词可以写成depth_first(N, ReturnList) :- df_real(2:1, N, [2:1], ReturnList). -
@lurker 没什么区别 :(
-
什么不是?将
NewList作为df_real的最后一个参数而不是_?我不明白它如何不能对结果产生影响。当你把它放在那里时,你会得到什么结果?即使它还不正确,它也必须产生一些的不同。从你的部分跟踪来看,它应该可以工作,或者至少让你更接近你想要的。 -
@lurker well 它是一样的 它返回 TRUE,当我跟踪它时,我得到相同的输出,当检查长度的条件返回 True 时,它会从创建的列表中弹出每个元素并返回变量,如在图片中:(
-
为了清楚起见,请显示您运行的更新代码以及更新后的跟踪。如果您按照我的建议进行操作,那么跟踪将无法与您在问题陈述中显示的一样。您遇到的另一个问题是第一个参数也使用
_(在_:NextRankC术语中)。我不确定您打算如何处理该论点,但由于您将其设为匿名,因此它丢失了。也许没关系,因为无论如何你已经在第三个参数中传递了同样的东西。