所以我在Prolog很新,我正在制作一个拼图解算器,我有一个带有这个签名的谓词:
nao_altera_linhas_anteriores(Posicoes, L, Ja_Preenchidas):-
其中Posicoes是行和列的列表,如下所示:
[(1,2), (2,3), (4,4)])
并且我不知道如何使用名称Posicoes访问列表中的每个元素,我也想访问每一行,所以在这个例子中我想要访问1,2和4,有没有人有想法?我只是一个乞丐,与C或Java相比,我在掌握如何使用这种语言时遇到了麻烦。
答案 0 :(得分:1)
您"访问"每个list元素都带有unification。
当您的谓词定义为:
pred([H|T]) :- ...
如果目标为pred(Z)
,则必须将Z
与[H|T]
统一,因此如果Z
是一个列表,H
为T
,则会成功该列表的第一个元素,pred([(X,Y)|T], [X|S]) :- pred(T, S).
pred([], []).
是包含其他元素的列表。
您可以构建更复杂的术语,以统一规则:
?- pred([(1,2), (2,3), (4,4)], L).
L = [1, 2, 4].
这将从第一个列表中提取X坐标:
input()
答案 1 :(得分:0)
以下是SWI-Prolog的解决方案:
?- Posicoes = [(1,2), (2,3), (4,4)], nth1(3, Posicoes, (Line, _)).
Posicoes = [(1, 2), (2, 3), (4, 4)],
Line = 4.
您可以使用它来搜索所有行:
?- nth1(Position, $Posicoes, (Line, _)).
Position = Line, Line = 1,
Position = Line, Line = 2,
Position = 3, Line = 4.