listprologsuccessor-arithmetics

Prolog predicate to multiply two lists (representing unary numbers)


I want to write a code that multiplies lists representing a number, like:
?- times([1,1,1], [1,1], Res).
Res = [1,1,1,1,1,1].

times([], _, []). % base case
times([_|T], Lis, [Lis|H]) :-
  times(T, Lis, H).

I already have the code above and it kinda does what I want but not really. For example when asking:
?- times([1,1,1], [1,1], Res)
Res = [[1,1],[1,1],[1,1]].

The idea is there, but I just don't know how to fix that, I understand why it's happening (I'm adding a list as head), so I just wondered if anybody could help me.
Thanks in advance.


Solution

  • [Lis|H] will use Lis as first element, regardless whether Lis is a list or not. You should take a look at append/3 [swi-doc] for example to append two lists:

    times([], _, []).
    times([_|T], Lis, R) :-
        append(Lis, H, R),
        times(T, Lis, H).