I have been asked to try to search for all possible outcomes of, removing any numbers from any single elements from a list.
For example, if I have a list X = [1,2,3]
You have to:
For example:
remove([N|Tail], [NX|Tail]):-
succ(N1, N),
between(1, N1, NX).
remove([_|Tail], Tail).
remove([N|Tail], [N|NTail]):-
remove(Tail, NTail).
The first clause selects the first item in the list, and replaces that item with a number which is less than the item.
The second clause removes the item from the list (as shown in your examples when you subtract N to the selected item (N) it does not appear in the second list.
The third clause applies recursion, leaving the head item as-is and applies the procedure to the remaining list.
Here's another solution using append/3
. I'm thinking @gusbro's answer is more elegant and/or efficient. But it's an alternative:
reduce(L, R) :-
append(L1, [X|L2], L),
( X1 is X - 1, % some element varies 1 to X-1
between(1, X1, Y),
append(L1, [Y|L2], R)
; append(L1, L2, R) % or the element is just removed
).