Упражнения. 3.3. Определите два предиката evenlength( List) и eddlength( List)
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