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

时间:2019-04-27 11:51:52

标签: prolog

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

1 个答案:

答案 0 :(得分: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.

我认为这基本上就是您想要得到的,请让我知道我是否可以澄清。