Упражнения. 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


Наши рекомендации