name = 'shiftright/2' slug = 'shift a list right' description = '''\
shiftright(L1, L2)
: the list L2
is obtained from L1 by shifting elements to the right by one (circular shift).
?- shiftright([1,2,3,4,5], X). X = [5,1,2,3,4].''' plan = ['''\
I take the last element from the given list and add it back at the start of the list's remainder. You probably still remember how we took the last element of the list? And adding an element at the start is quite simple, isn't it?
''', '''\A list of length one is represented as a pattern [X]
. This might come in handy, as well
as the predicate conc/3
.
If the given list L
is composed of last element E
and the remainder L1
,
and if we put E
at the start of L1
, then we get list L
shifted right.
The operator ==
is "stricter" than operator =
in the sense that
for the latter it is enough to be able to make the two operands equal (unification). Perhaps by using =
you can make the predicate shiftleft/2
more general (e.g. able to work with output arguments becoming inputs).
Of course, you can also solve the exercise without explicit use of either of these two operators, just remember that unification is implicitly performed with the predicate's arguments (head of clause).
''', 'eq_instead_of_equ_markup': '''\Perhaps the operator for unification (=) would be better?
''', 'predicate_always_false': '''\It seems your predicate is
If the name is correct, check whether something else is misspelled, perhaps there is a full stop instead of a comma or vice versa, or maybe you typed a variable name in lowercase?
It is, of course, also possible that your conditions are too restrictive, or even impossible to satisfy
(as would be, for example, the condition that N
is equal to N + 1
,
or something similarly impossible).
Is there an infinite recursion at work here? How will it ever stop?
Or perhaps is there a missing, faulty, or simply incompatible (with the general recursive case) base case?
''', 'conc_2nd_argument_not_1elem_list': '''\Do you remember how the "pattern" representing a list with exactly one element looks like? Not like
the second argument you gave to predicate conc/3
. ;)
Did you connect (use) all the variables? It seems as if you're returning an arbitrary result (a variable without an assigned value). It's usually not a good idea to ignore the warning about "singleton variables".
''', 'shiftleftish_solution': '''\The tail of the list is always another list and never just an element. How did you get the last element? This will not work...
''', 'last_used': '''\By using predicate last/2
it will be difficult to solve this exercise as it leaves the last
element in the original list. Rather try using predicate conc/3
instead.
Predicates shiftleft/2
and shiftright/2
perform exactly the opposite function.
If you simply swap the order of their arguments, you get the other predicate. In this way you could
program shiftright/2
just by calling shiftleft/2
. You know that in prolog inputs
and outputs can often be interchanged.