name = 'shiftleft/2' slug = 'shift a list left' description = '''\

shiftleft(L1, L2): the list L2 is obtained from L1 by shifting elements to the left by one (circular shift).

?- shiftleft([1,2,3,4,5], X).
  X = [2,3,4,5,1].
''' plan = ['''\

I take the first element of a list, let's call it H, and add it at the end of the list's remainder (let's call the remainder T). As simple as that! You probably still remember how we took the last element of the list? Adding an element is the same operation as taking it, just from the opposite view ;)

''', '''\

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 head H and tail T, and if we add H at the end of T, then we get list L shifted left.

'''] hint = { 'eq_instead_of_equ': '''\

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 always "false". Did you give it the correct name, or is it perhaps misspelled?

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

''', 'timeout': '''\

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_arg_not_list': '''\

All three arguments of predicate conc/3 are lists. Are you sure you used it properly?

''', 'arbitrary_result': '''\

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

''', 'tail_must_be_list': '''\

The list's tail is always another list and never an element!

''', }