【发布时间】: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
我想在 Prolog 中创建一个函数,将两个列表按组件相乘并返回结果列表。
例如:
?- multiply_lists([1,2,3], [4,5,6], X).
X = [4,10,18].
我想在不使用 Prolog 内置函数的情况下编写此函数。
【问题讨论】:
标签: list recursion prolog multiplication
首先定义基本情况——两个空列表相乘的结果就是空列表。
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).
【讨论】:
有趣的是
:- 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.
【讨论】: