3.3. Определите два предиката
evenlength(List) и eddlength(List)
такие, что они становятся истинными, если их параметром является список, который, соответственно, содержит четное или нечетное количество элементов (имеет четную или нечетную длину). Например, список (а, Ь, с, d] соответствует предикату evenlength, тогда как [ а, Ь, с ] — предикату
oddlength.
3.4. Определите отношение
reverse! List, ReversedList }
которое изменяет порядок следования элементов в списках на противоположный, например reverse ([ а, Ь, с, d], [ d, с, Ь, а]).
3.5. Определите предикат palindrome (List). Список является палиндромом,
если он читается одинаково в прямом и обратном направлении, например
[:i,а, а, а, т].
3.6. Определите отношение
Глава 3. Списки, операции, арифметические выражения 85
shift(Listl, List2)
такое, что List2 представляет собой Listl после "кругового сдвига" на один элемент влево. Например, вопрос
Т- shift< [1,2,3,4,5), L1),
shift С Ы, L2).
приводит к получению следующего ответа;
L1 = [2,3,4,5,1] L2 - (3,4,5,1,2]
3.7. Определите отношение
translate; Listl, List2)
для преобразования списка цифр от 0 до 9 в список соответствующих слов,
например, следующим образом:
translate; [3,5,1,3], (three, five,one,three])
Используйте следующие факты в качестве вспомогательного отношения:
means (0, zero).
means (1, one).
means (2, two).
3.8. Определите отношение
subset! Set, Subset)
где Set и Subset — два списка, представляющие два множества. Необходимо предусмотреть, чтобы это отношение можно было использовать не только для проверки принадлежности подмножества к множеству, но и для получения всех возможных подмножеств данного множества, например, следующим образом:
?- subset ([a,b,c], S].
S = [а,Ь, с ],-
S = [a,b];
S = [а,с];
S = [a];
S " [b,c] 1
S = [b];
3.9. Определите отношение
drvidelistf List, Listl, L^st2>
таким образом, чтобы элементы списка List распределялись между списками Listl и List2, причем Listl и List2 имели примерно одинаковую длину, например dividelist ([ а, Ь, с, d, е], [ а, с, е], [ Ь, d]).
3.10. Переопределите программу с обезьяной и бананом, приведенную в главе 2, как отношение canget( State, Actions)
чтобы она не просто отвечала "yes" или "по", но и вырабатывала последовательность действий обезьяны, представленную как список шагов, например: Actions - [ walk (door, window), push (window, middle), climb, grasp] 3-11- Определите отношение
flatten (List, FlatList)
где List может представлять собой список списков, a FlatList является списком List, "линеаризованным" таким образом, чтобы элементы подсписков (или л од подсписков) List были реорганизованы в виде одного линейного списка, например:?- flatten! (a,b, [c,d], [], t[[ej]],fj, L).
L = [ a, b, c, d, e, f]
86 Часть I. Язык Prolog