name = 'is_sorted/1' slug = 'check if list is sorted' description = '''\

is_sorted(L): the elements of list L are sorted in non-decreasing order.

?- is_sorted([2,3,6,8,12]).
  true.
?- is_sorted([2,3,1,6,5]).
  false.
''' plan = ['''\

As always try to reduce the problem onto a smaller one. Do an appropriate check (comparison) at the start of the list, and submit the tail to a recursive check.

''', '''\

You do know how to access the first two elements of the list, right? And the arithmetic comparison operators were introduced in the previous batch of exercises.

''', '''\

If the given list L is composed of heads H1 and H2 and of tail T, and if we assume that tail T along with the second head is sorted, and furthermore H1 is smaller or equal to H2, then the whole list L is sorted.

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

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?

''', 'base_case': '''\

Did you think of a base case? Which is one of the shortest sorted lists?

''', 'recursive_case': '''\

The base case is ok. However, what about the general recursive case?

''', '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 X is simultaneously smaller and greater than Y, 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?

''', '[]_base_case_missing': '''\

For completeness, please take care of the special case, i.e. the empty list which is also sorted. But be careful not to destroy the other solutions.

''', 'duplicates_fail': '''\

Did you forget about duplicate elements? The list below is also sorted!

?- is_sorted([25,25,25,25]).

''', 'H1_instead_of_H2_sent_into_recursion': '''\

Did you send the wrong of the two list heads into recursion?

''', 'base_case_at_len_1_missing': '''\

The recursive case in this exercise requires two elements, even though you put one back when the tail is recursively processed. But what happens when there is just a single element left in the list? Think about it as this will probably be the main base case.

''', 'both_heads_omitted_from_recursion': '''\

Are you taking two elements out of the list before initiating a recursive call? You're trying to reduce the number of comparisons, aren't you? ;) But unfortunately this will not be possible! Of the following two cases below one works correctly and one doesn't. What's the difference between them?

?- is_sorted([1,3,14,16,24,25]).

?- is_sorted([24,25,14,16,1,3]).

''', 'min_used': '''\

Try solving this exercise without using the predicate min/2. Your solution should have the time complexity of O(n). By using min/2 the complexity is typically about O(n*n).

''', }