Программирование на языке Пролог для искусственного интеллекта | страница 53
для перевода списка чисел от 0 до 9 в список соответствующих слов. Например,
>перевод( [3, 5, 1, 3], [три, пять, один, три] )
Используйте в качестве вспомогательных следующие отношения:
>означает( 0, нуль).
>означает( 1, один).
>означает( 2, два).
>...
3.8. Определите отношение
>подмножество( Множество, Подмножество)
где >Множество
и >Подмножество
— два списка представляющие два множества. Желательно иметь возможность использовать это отношение не только для проверки включения одного множества в другое, но и для порождения всех возможных подмножеств заданного множества. Например:
>?- подмножество( [а, b, с], S ).
>S = [a, b, c];
>S = [b, c];
>S = [c];
>S = [];
>S = [a, c];
>S = [a];
>...
3.9. Определите отношение
>разбиениесписка( Список, Список1, Список2)
так, чтобы оно распределяло элементы списка между двумя списками >Список1
и >Список2
и чтобы эти списки были примерно одинаковой длины. Например:
>разбиениесписка( [а, b, с, d, e], [a, с, e], [b, d]).
3.10. Перепишите программу об обезьяне и бананах из главы 2 таким образом, чтобы отношение
>можетзавладеть( Состояние, Действия)
давало не только положительный или отрицательный ответ, но и порождало последовательность действий обезьяны, приводящую ее к успеху. Пусть >Действия
будет такой последовательностью, представленной в виде списка ходов:
>Действия = [ перейти( дверь, окно),
> передвинуть( окно, середина),
> залезть, схватить ]
3.11. Определите отношение
>линеаризация( Список, ЛинейныйСписок)
где >Список
может быть списком списков, а >ЛинейныйСписок
— это тот же список, но "выровненный" таким образом, что элементы его подсписков составляют один линейный список. Например:
>?- линеаризация( [а, d, [с, d], [], [[[e]]], f, L).
>L = [a, b, c, d, e, f]
3.3. Операторная запись (нотация)
В математике мы привыкли записывать выражения в таком виде:
2*a + b*с
где + и * — это операторы, а 2, а, b, с — аргументы. В частности, + и * называют инфиксными операторами, поскольку они появляются между своими аргументами. Такие выражения могут быть представлены в виде деревьев, как это сделано на рис. 3.6, и записаны как прологовские термы с + и * в качестве функторов:
>+( *( 2, а), *( b, с) )
Рис. 3.6. Представление выражения 2*а+b*с в виде дерева.
Поскольку мы обычно предпочитаем записывать такие выражения в привычной инфиксной форме операторов, Пролог обеспечивает такое удобство. Поэтому наше выражение, записанное просто как
>2*а + b*с
будет воспринято правильно. Однако это лишь внешнее представление объекта, которое будет автоматически преобразовано в обычную форму прологовских термов. Такой терм выводится пользователю снова в своей внешней инфиксной форме.