![]() Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву ![]() Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Решение логических задач в ПРОЛОГеСодержание книги
Поиск на нашем сайте
ПРОЛОГ позволяет наиболее естественным образом решать логические задачи, моделируя процесс размышления человека с помощью правил. Многие логические задачи связаны с рассмотрением нескольких конечных множеств с одинаковым количеством элементов, между которыми устанавливается взаимно-однозначное соответствие. В ПРОЛОГе эти множества можно описывать как базы данных, а зависимости между объектами устанавливать с помощью правил.
В автомобильных гонках три первых места заняли Алеша, Петя и Коля. Какое место занял каждый из них, если Петя занял не второе и не третье место, а Коля - не третье? Решение Традиционным способом задача решается заполнением таблицы. По условию задачи Петя занял не второе и не третье место, а Коля - не третье. Это позволяет поставить символ '-' в соответствующих клетках.
Между множеством имен участников гонки и множеством мест должно быть установлено взаимнооднозначное соответствие. Поэтому определяем занятое место сначала у Пети, затем у Коли и, наконец, у Алеши. В соответствующих клетках проставляем знак '+'. В каждой строке и каждом столбце должен быть только один такой знак.
Из последней таблицы следует, что Алеша занял третье место, Петя - первое, Коля - второе. Программа на ПРОЛОГе будет выглядеть следующим образом: PREDICATES имя(string) место(string) соответствие(string,string) решение(string,string,string,string,string,string) CLAUSES имя(алеша). имя(петя). имя(коля). место(первое). место(второе). место(третье). /* Устанавливаем взаимнооднозначное соответствие между множеством имен и множеством мест, X - имя,Y - место */ /* Петя занял не второе и не третье место */ соответствие(X, Y):-имя(X), X=петя, место(Y),not(Y=второе), not(Y=третье). /* Коля занял не третье место */ соответствие(X, Y):- имя(X), X=коля, место(Y), not(Y=третье). соответствие(X, Y):- имя(X), X=алеша, место(Y). /* У всех ребят разные места */ решение(X1,Y1,X2,Y2,X3,Y3):- X1=петя,соответствие(X1,Y1), X2=коля,соответствие(X2,Y2), X3=алеша,соответствие(X3,Y3), Y1<>Y2, Y2<>Y3, Y1<>Y3. GOAL решение(X1,Y1,X2,Y2,X3,Y3), write(X1," - ",Y1),nl, write(X2," - ",Y2),nl,write(X3," - ",Y3),nl.
Результат выполнения программы петя - первое коля - второе алеша - третье
Пример 2 Наташа, Валя и Аня вышли на прогулку, причем туфли и платье каждой были или белого, или синего, или зеленого цвета. У Наташи были зеленые туфли, а Валя не любит белый цвет. Только у Ани платье и туфли были одного цвета. Определить цвет туфель и платья каждой из девочек, если у всех туфли и платья были разного цвета. Решение PREDICATES имя(string) туфли(string) платье(string) соот(string,string,string) решение(string,string,string,string,string,string, string,string,string) CLAUSES имя(наташа). имя(валя). имя(аня). туфли(белый). туфли(синий). туфли(зеленый). платье(белый). платье(синий). платье(зеленый). % X – имя, Y – цвет туфель, Z – цвет платья соот(X,Y,Z):-имя(X),туфли(Y),платье(Z), X=наташа,Y=зеленый,Y<>Z. соот(X,Y,Z):-имя(X),туфли(Y),платье(Z), X=валя,not(Y=белый), not(Z=белый), Y<>Z. соот(X,Y,Z):-имя(X),туфли(Y),платье(Z),X=аня,Y=Z. решение(X1,Y1,Z1,X2,Y2,Z2,X3,Y3,Z3):- X1=наташа,соот(X1,Y1,Z1), X2=валя, соот(X2,Y2,Z2), X3=аня, соот(X3,Y3,Z3), Y1<>Y2, Y2<>Y3, Y1<>Y3, Z1<>Z2, Z2<>Z3, Z1<>Z3. GOAL решение(X1,Y1,Z1,X2,Y2,Z2,X3,Y3,Z3), write(X1," туфли- ",Y1," платье- ",Z1),nl, write(X2," туфли- ",Y2," платье- ",Z2),nl, write(X3," туфли- ",Y3," платье- ",Z3),nl. Результат выполнения программы наташа туфли - зеленый платье - синий валя туфли - синий платье - зеленый аня туфли - белый платье - белый Пример 3 Витя, Юра и Миша сидели на скамейке. В каком порядке они сидели, если известно, что Миша сидел слева от Юры, а Витя слева от Миши. Решение PREDICATES слева(string,string) ряд(string,string,string) CLAUSES /* Миша сидел слева от Юры */ слева(миша, юра). /* Витя сидел слева от Миши */ слева(витя, миша). /* Объекты X, Y и Z образуют ряд, если Х слева от Y и Y слева от Z */ ряд(X, Y, Z):- слева(X,Y), слева(Y, Z). GOAL ряд(X, Y, Z), write(X,"-",Y,"-",Z),nl. Результат выполнения программы витя-миша-юра
Пример 4 Известно, что тополь выше березы, которая выше липы. Клен ниже липы, а сосна выше тополя и ниже ели. Определить самое высокое и самое низкое дерево. Решение DOMAINS name=string PREDICATES выше(name,name) ряд(name,name,name,name,name,name) CLAUSES выше(тополь,береза). выше(липа,клен). выше(ель,сосна). выше(береза,липа). выше(сосна,тополь). ряд(X1,X2,X3,X4,X5,X6):-выше(X1,X2),выше(X2,X3), выше(X3,X4),выше(X4,X5), выше(X5,X6).
GOAL ряд(X,_,_,_,_,Y),write("Самое высокое - ",X),nl, write("Самое низкое - ",Y),nl.
Результат выполнения программы Самое высокое - ель Самое низкое - клен ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ 1. Трое ребят вышли гулять с собакой, кошкой и хомячком. Известно, что Петя не любит кошек и живет в одном подъезде с хозяйкой хомячка. Лена дружит с Таней, гуляющей с кошкой. Определить, с каким животным гулял каждый из детей. 2. Беседуют трое друзей: Белокуров, Рыжов и Чернов. Брюнет сказал Белокурову: «Любопытно, что один из нас блондин, другой – брюнет, а 3. Витя, Юра, Миша и Дима сидели на скамейке. В каком порядке они сидели, если известно, что Юра сидел справа от Димы, Миша справа от Вити, а Витя справа от Юры. 4. Известно, что Волга длиннее Амударьи, а Днепр короче Амударьи. Лена длиннее Волги. Определить вторую по протяженности реку. Отчет о выполненной самостоятельной работе должен содержать: 1) тему лабораторной работы; 2) условие задачи; 3) решение задачи традиционным способом (с помощью таблицы); 4) листинг программы; 5) результаты ее тестирования с различными исходными данными. Списки Список – это объект, который содержит конечное число других объектов. Список в ПРОЛОГе заключается в квадратные скобки и элементы списка разделяются запятыми. Список, который не содержит ни одного элемента, называется пустым списком. Список является рекурсивным объектом. Он состоит из головы (первого элемента списка) и хвоста (все последующие элемента). Хвост также является списком. В ПРОЛОГе имеется операция “|”, которая позволяет делить список на голову и хвост. Пустой список нельзя разделить на голову и хвост. Тип данных "список" объявляется в программе на Прологе следующим образом: DOMAINS списковый_тип = тип* где "тип" - тип элементов списка; это может быть как стандартный тип, так и нестандартный, заданный пользователем и объявленный в разделе DOMAINS ранее. Основными операциями на списками являются: - формирование списка; - объединение списков; - поиск элемента в списке; - вставка элемента в список и удаление из списка. - Пример 1 Сформировать список вида [7,6,5,4,3,2,1] Решение DOMAINS list = integer* PREDICATES genl(integer, list) CLAUSES genl(0,[]):-!. genl(N,[N|L]):-N1=N-1, genl(N1,L). GOAL genl(7,L),write(L),nl. Результат выполнения программы: [7,6,5,4,3,2,1] Пример 2 Сформировать список из N элементов, начиная с 2. Каждый следующий на 4 больше предыдущего. Решение DOMAINS list = integer* PREDICATES genl(integer, integer, list) CLAUSES genl(N2,N2,[]):-!. genl(N1,N2,[N1|L]):-N1<N2, N=N1+4, genl(N,N2,L). GOAL write("N="),readint(N),K=4*(N+1)-2, genl(2,K,L),write(L),nl. Результат выполнения программы: N=5 [2,6,10,14,18] Пример 3 Сформировать список последовательных натуральных чисел от 4 до 20 и найти количество его элементов. Решение: DOMAINS list = integer* PREDICATES genl1(integer, integer, list) len(integer, list) CLAUSES genl1(N2,N2,[]):-!. genl1(N1,N2,[N1|L]):-N1<N2, N=N1+1, genl1(N,N2,L). len(0,[]). len(X,[_|L]):-len(X1,L), X=X1+1. GOAL genl1 (4,21,L),write(L),nl, len(X, L),write("Количество элементов=",X),nl. Результат выполнения программы: [4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20] Количество элементов=17
Пример 4 Определить, содержится ли введенное число Х в заданном списке L. Решение: DOMAINS list = integer* PREDICATES member(integer, list) CLAUSES member(X,[X|_]):-write("yes"),!. member(X,[]):-write("no"),!. member(X,[_|L]):- member(X, L). GOAL L=[1,2,3,4], write(L),nl, write("X="),readint(X),
member(X, L),nl. Результат выполнения программы: 1-й случай: [1,2,3,4] X=3 yes 2-й случай: [1,2,3,4] X=5 no
Пример 5 Сформировать списки L1=[1,2,3], L2=[10,11,12,13,14,15] и объединить их в список L3. Решение: DOMAINS list = integer* PREDICATES genl1(integer,integer,list) append(list,list,list) CLAUSES genl1(N2,N2,[]):-!. genl1(N1,N2,[N1|L]):-N1<N2,N=N1+1,genl1(N, N2, L). append([],L,L). append([X|L1],L2,[X|L3]):-append(L1,L2,L3). GOAL genl1(1,4,L1),write("L1=",L1),nl, genl1(10,16,L2),write("L2=",L2),nl, append(L1,L2,L3),write("L3=",L3),nl. Результат выполнения программы: L1=[1,2,3] L2=[10,11,12,13,14,15] L3=[1,2,3,10,11,12,13,14,15] Пример 6 Удалить из списка, элементами которого являются названия дней недели, указанный элемент. Решение: DOMAINS list = symbol* PREDICATES del(symbol,list,list) CLAUSES del(X,[X|L],L). del(X,[Y|L],[Y|L1]):-del(X,L,L1). GOAL L=[пн, вт, ср, чт, пт, сб, вс],write("L=",L),nl, write("X="),readln(X), del(X,L,L1),write("L1=",L1),!; write("Элемент отсутствует в списке"),nl. Результат выполнения программы: 1-й случай: L=["пн","вт","ср","чт","пт","сб","вс"] X=ср L1=["пн","вт","чт","пт","сб","вс"] 2-й случай: L=["пн","вт","ср","чт","пт","сб","вс"] X=пр Элемент отсутствует в списке Пример 7 Вставить в список имен новый элемент, значение которого вводится с клавиатуры. Вывести все возможные варианты вставок. Решение: DOMAINS list = symbol* PREDICATES del(symbol,list,list) ins(symbol,list,list) CLAUSES del(X,[X|L],L). del(X,[Y|L],[Y|L1]):-del(X,L,L1). ins(X,L1,L):-del(X,L,L1). GOAL L=[olga, oksana, toma, dima],write("L=",L),nl, write("X="),readln(X), ins(X,L,L1),write("L1=",L1),nl, fail. Результат выполнения программы: L=["olga","oksana","toma","dima"] X=vera L1=["vera","olga","oksana","toma","dima"] L1=["olga","vera","oksana","toma","dima"] L1=["olga","oksana","vera","toma","dima"] L1=["olga","oksana","toma","vera","dima"] L1=["olga","oksana","toma","dima","vera"]
Пример 8 Найти сумму элементов списка целых чисел. Решение: DOMAINS list=integer* PREDICATES sum_list(list, integer) CLAUSES sum_list([],0). sum_list([X|L],S):-sum_list(L,S1),S=S1+X. GOAL L=[1,2,3,4,5],sum_list(L,S), write("S=",S). Результат выполнения программы: S=15 ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ 1. Сформировать список [2, 4, 6, 8, 10] и удалить из него введенное число. 2. Сформировать списки [1, 3, 5, 7, 9] и [2, 4, 6, 8, 10] и объединить их в один. 3. Сформировать список [3, 6, 9, 12, 15, 18] и вставить в него введенное число. 4. Сформировать список из N натуральных чисел, начиная с 10. Каждое следующее на 5 больше предыдущего. 5. Сформировать список [3, 6, 9, 12, 15] и найти сумму его элементов 6. Сформировать список [6, 5, 4, 3, 2] и найти сумму его элементов
7. Сформировать список [7, 5, 3, 1] и найти произведение его элементов 8. Сформировать список из N последовательных натуральных чисел, начиная с 10. Найти сумму его элементов Отчет о выполненной самостоятельной работе должен содержать: 1) тему лабораторной работы; 2) условие задачи; 3) листинг программы; 4) результаты ее тестирования.
|
||||||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2016-04-08; просмотров: 3598; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.191.144.73 (0.012 с.) |