Умножить два списка по компонентам в Прологе - PullRequest
0 голосов
/ 12 мая 2018

Я хотел бы создать функцию в Прологе, которая умножает два списка по компонентам и возвращает полученный список.

Например:

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

Я хотел бы написать этофункция без использования встроенных функций Prolog.

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

Интересно, это

:- 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.
0 голосов
/ 12 мая 2018

Сначала определите базовый случай - результатом умножения двух пустых списков будет пустой список.

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).
...