我正在尝试编写谓词pick_slots(Puzzle, Slots)
。 Puzzle
是一个列表列表,其中的元素为'_'
和'#'
。例如[['#', '_', '#'], ['_', '_', '_'], ['_', '#', '_']]
。当Slots
是在令牌'#'
处拆分的列表列表时,谓词应该成立,例如,如果Puzzle
为Slots
,谓词将保留给定[['_'], ['_', '_', '_'], ['_'], ['_']]
}。
我的代码是:
pick_slots([], _).
pick_slots([H|Rest], R) :-
split(H, '#', Result),
append(Result, R, R2),
pick_slots(Rest, R2).
当split(S, T, R)
是R
在令牌S
处拆分的列表列表时, T
成立。例如,如果S
为['_', '#', '_']
,T
为'#'
,则R
为[['_'], ['_']]
。
我的代码不起作用,因为它总是以列表末尾的逻辑变量退出。我检查调试并看到它像这样退出:
Exit: (12) pick_slots([], [['_'], ['_', '_', '_'], ['_'], ['_']|_G3154869]) ? skip
我不知道如何制作_G3154869
[]
。有解决方案吗谢谢。
答案 0 :(得分:2)
您的问题是为什么列表的其余部分中存在变量。这被称为部分列表。现在,这很容易回答:
首先,考虑以下事实:在这种情况下,第二个参数是一个自由变量 - 这也是一个部分列表。
然后,考虑规则并从右向左阅读:我们假设R2
是pick_slots(Rest, R2)
中的部分列表。因此,R
也将是部分列表 - 无论Result
是什么。