我正在大学里做一个项目,并且尝试使用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添加变量。
答案 0 :(得分:0)
完成这项工作所需的主要技巧是可以将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.
我认为这基本上就是您想要得到的,请让我知道我是否可以澄清。