【问题标题】:Multiply two lists component-wise in Prolog在 Prolog 中将两个列表组件相乘
【发布时间】:2018-05-12 14:49:10
【问题描述】:

我想在 Prolog 中创建一个函数,将两个列表按组件相乘并返回结果列表。

例如:

?- multiply_lists([1,2,3], [4,5,6], X).
X = [4,10,18].

我想在不使用 Prolog 内置函数的情况下编写此函数。

【问题讨论】:

    标签: list recursion prolog multiplication


    【解决方案1】:

    首先定义基本情况——两个空列表相乘的结果就是空列表。

    multl([],[],[]).
    

    然后,定义函数的递归部分:

    multl([H1|Tail1],[H2|Tail2], [H3|Tail3]):-
            multl(Tail1, Tail2, Tail3),
            H3 is (H1 * H2).
    

    这里发生的情况是两个列表头部的元素被相乘并与结果的尾部连接。

    总而言之,我们有:

    multl([],[],[]).
    multl([H1|Tail1],[H2|Tail2], [H3|Tail3]):-
        multl(Tail1, Tail2, Tail3),
        H3 is (H1 * H2).
    

    【讨论】:

      【解决方案2】:

      有趣的是

      :- use_module(library(clpfd)).
      
      mutiply(X,Y,Z) :-
          Z #= X*Y.
      
      multiply_lists(L1, L2, Out) :-
          maplist(mutiply, L1,L2,Out).
      

      结果:

      ?-  multiply_lists([1,2,3], [4,5,6], X).
      X = [4, 10, 18].
      
      ?- multiply_lists(X, [4,5,6], [4,8,10]).
      false.
      
      ?- multiply_lists(X, [4,5,6], [4,10,18]).
      X = [1, 2, 3].
      
      ?- multiply_lists(X, Y, [4,10,18]).
      X = [_17366, _17372, _17378],
      Y = [_17396, _17402, _17408],
      _17366 in -4.. -1\/1..4,
      _17366*_17396#=4,
      _17396 in -4.. -1\/1..4,
      _17372 in -10.. -1\/1..10,
      _17372*_17402#=10,
      _17402 in -10.. -1\/1..10,
      _17378 in -18.. -1\/1..18,
      _17378*_17408#=18,
      _17408 in -18.. -1\/1..18.
      

      【讨论】:

      • 这很有趣,但我需要从头开始编写函数,而不使用任何库函数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-22
      • 2022-11-28
      • 1970-01-01
      相关资源
      最近更新 更多