我正在大学做一个项目,我正在尝试使用Prolog,在这种情况下,我必须逐个运行列表中的元素三个,但是我没有成功地用正确的变量统一列表( X,Y,Z)和我的程序不断向列表中添加越来越多的变量。
aplica_R1_fila_aux(Fila, N_Fila) :-
copia(Fila, N_Fila).
aplica_R1_fila_aux(Fila, [X,Y,Z|T]) :-
aplica_R1_Triplo([X,Y,Z], F),
aplica_R1_fila_aux(Fila, T).
这段代码应该将列表Fila复制到N_Fila然后用N_Fila统一[X,Y,Z | T]并更改列表,但它只是不断向N_Fila添加变量。
你需要做的主要技巧是你可以使用call/N
和不同数量的参数。因此,一旦你剥离了X
,Y
和Z
,你可以用Goal
获得你的call(Goal, X, Y, Z, Result)
对他们的结果。
有几种方法可以做到这一点,但我宁愿只制作三个子列表并重复所有这三个子列表。当最右边的人筋疲力尽时,你就会重复出现。这样可以减少需要担心的基本情况(没有,一个或两个元素的列表不需要单独处理)并且没有剪切,因此您的代码最终会如下所示:
map3(Goal, [X,Y,Z|L], Solutions) :-
map3(Goal, [X,Y,Z|L], [Y,Z|L], [Z|L], Solutions).
map3(_, _, _, [], []).
map3(Goal, [X|XR], [Y|YR], [Z|ZR], [R|Rest]) :-
call(Goal, X, Y, Z, R),
map3(Goal, XR, YR, ZR, Rest).
这也可以在没有辅助谓词的情况下解决,但是有些东西让我冒犯了它,这在费用方面确实不应该更糟,所以这就是我的方式。
有了foo(X,Y,Z, foo(X,Y,Z))
的虚拟目标,我得到了这个示例查询和结果:
?- map3(foo, [a,b,c,d,e,f], Result).
Result = [foo(a, b, c), foo(b, c, d), foo(c, d, e), foo(d, e, f)] ;
false.
我认为这基本上就是你想要的,让我知道我是否可以澄清任何事情。