【问题标题】:GNU Prolog - Loop and new listGNU Prolog - 循环和新列表
【发布时间】:2011-05-26 07:14:38
【问题描述】:

这只是一个一般性问题,源于其他问题。

假设您想要矩阵中的产品表(我认为这就是它的名称)。

我输入的例子

outer([1,2,3],[4,5,6],L).

Then L = [[4,5,6],[8,10,12],[12,14,18]]

所以我想遍历两个列表并创建一个新列表。

我知道了:

outer(L1,L2,L3) :-
    append(LL,[L|RL],L1),
    append(LE,[E|RE],L2),
    Prod is L * E, !,
    append(LE,[Prod|RE], NewL),
    append(LL,[NewL|RL], L3).

这有点接近。我知道我可以使用 append 来遍历两个列表,但不确定如何创建一个新列表。在创建一个全新的列表时总是会遇到麻烦。

谢谢。

【问题讨论】:

    标签: list loops prolog append


    【解决方案1】:
    product([],_,[]).
    product([H1|T1],L2,R):- mul(H1,L2,R1),product(T1,L2,R2),append([R1],R2,R).
    
    mul(X,[],[]).
    mul(X,[H|T],[Z|R]):-Z is X*H, mul(X,T,R).
    

    【讨论】:

      【解决方案2】:

      这是另一个,它使用 map 而不是 append。点积是为涉及非数字的产品生成的。它也是确定性的。

      乘数:

      amul([], _Other_Row,[]).
      amul([X|Xs],Other_Row,[Row_Out|Rest_Out]) :-    
          maplist(mul(X),Other_Row, Row_Out),
          amul(Xs,Other_Row, Rest_Out).
      

      产品谓词:

      mul(X,Y, Prod) :-
          ( number(X), number(Y)
          -> Prod is X * Y
          ; true
          ->  Prod = dot(X,Y)
          ).
      

      [1,3,5] X [2,4,6]

      ?- amul([1,3,5], [2,4,6],Prod).
      Prod = [[2, 4, 6], [6, 12, 18], [10, 20, 30]].
      

      [a,b,c] X [1,2,3,4]

      ?- amul([a,b,c],[1,2,3,4],Prod).
      Prod = [[dot(a, 1), dot(a, 2), dot(a, 3), dot(a, 4)], 
              [dot(b, 1), dot(b, 2), dot(b, 3), dot(b, 4)], 
              [dot(c, 1), dot(c, 2), dot(c, 3), dot(c, 4)]].
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-29
        • 2012-08-05
        相关资源
        最近更新 更多