如何统一此列表而不是仅添加更多变量?

问题描述 投票:0回答:1

我正在大学做一个项目,我正在尝试使用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添加变量。

prolog
1个回答
0
投票

你需要做的主要技巧是你可以使用call/N和不同数量的参数。因此,一旦你剥离了XYZ,你可以用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.

我认为这基本上就是你想要的,让我知道我是否可以澄清任何事情。

© www.soinside.com 2019 - 2024. All rights reserved.