为什么在我的Prolog列表末尾有一个逻辑变量?

时间:2014-10-23 20:40:41

标签: prolog

我正在尝试编写谓词pick_slots(Puzzle, Slots)Puzzle是一个列表列表,其中的元素为'_''#'。例如[['#', '_', '#'], ['_', '_', '_'], ['_', '#', '_']]。当Slots是在令牌'#'处拆分的列表列表时,谓词应该成立,例如,如果PuzzleSlots,谓词将保留给定[['_'], ['_', '_', '_'], ['_'], ['_']] }。

我的代码是:

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 []。有解决方案吗谢谢。

1 个答案:

答案 0 :(得分:2)

您的问题是为什么列表的其余部分中存在变量。这被称为部分列表。现在,这很容易回答:

首先,考虑以下事实:在这种情况下,第二个参数是一个自由变量 - 这也是一个部分列表

然后,考虑规则并从右向左阅读:我们假设R2pick_slots(Rest, R2)中的部分列表。因此,R也将是部分列表 - 无论Result是什么。