Автор: Руслан 7.03.2007 21:41
Ребяты, нужно написать программу, которая бы решала Силлогизмы, самые обыкновенные (хотя бы) с двумя посылками. Не могу разработать алгоритм! Может кто-нить может подсказать что по этому поводу, а то ощущаю себя полным дураком!
Автор: Michael_Rybak 7.03.2007 23:06
Формализовать их сначала надо. Ты ж не будешь семантику разбирать сам
Придумай, как юзеру задавать силлогизмы. Какого вида бывают предпосылки? Надо чтоб юзер только задавал названия множеств и отношения.
Например, фраза "все кролики любят морковку, если только на них не смотрят искоса" будет для юзера выглядеть как фраза "ALL x є С: NOT F(x) -> x є A", где С - множество кроликов, x - элемент множества кроликов, А - подмножество кроликов, которые любят морковку, F(x) - функция, возвращающая True тогда и только тогда, когда на кролика смотрят искоса.
Вот. И юзер должен сначала указать, что есть у нас множества A и C, что есть функция F из А в {True, False}, что между множествами А и С имеет место отношение "А - подмножество С", а дальше задавать формулы аналогичные той, которую я привел.
Вообще это все сложновато как для дз. Тебе наверное определенный вид силлогизмов надо решать. Какой?
Автор: Руслан 8.03.2007 10:54
Цитата(Michael_Rybak @ 8.03.2007 2:06)
Тебе наверное определенный вид силлогизмов надо решать. Какой?
Нужно решать силлогизмы следующего типа, например:
Все люди смертны
Все ученые люди_______________
Все ученые смертны.В общем, чтоб из двух
посылок, выводилось
заключение.
Нужно чтоб программа, определяла к какому модусу относиться силлогизм, и исходя из этого выводила заключение! Препод сказал, что программу писать часа 3 не больше, я уже неделю над алгоритмом сижу! Чего-то недопонимаю, а чего хрен знает!
Автор: Michael_Rybak 9.03.2007 7:54
Перечитай мое сообщение и примени его к своему примеру.
Юзер не должен вводить "Все люди смертны". Юзер должен вводить ALL x: x in A -> x in B.
А точнее не вводить вот так прямо, а выбирать: задаю правило вида "все из А являются В". Понимаешь к чему я вообще это всё?
Автор: Руслан 9.03.2007 12:57
Вот это я понимаю,
Ввод ведеться следующим образом: Все (Некоторые, Ни один) Х Суть (Не суть) (не) У
Вся проблема в том, каким образом мне из двух посылок получить заключение и как определить модус!!!!!
Автор: Michael_Rybak 9.03.2007 17:59
http://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D0%BB%D0%BB%D0%BE%D0%B3%D0%B8%D0%B7%D0%BC#.D0.A4.D0.B8.D0.B3.D1.83.D1.80.D1.8B_.D0.B8_.D0.BC.D0.BE.D0.B4.D1.83.D1.81.D1.8B
Сначала определяешь M, потом S и P. Сразу получаешь фигуру.
Теперь http://www.refstar.ru/data/r/id.9903_1.html
Код
n общеутвердительные (А)
n общеотрицательные (Е)
n частноутвердительные (I)
n частноотрицательные (O
Первая фигура
AAA - Barbara
EAE - Celarent
AII - Darii
EAI - Ferio
AAI - Barbari
EAO - Celaront
Вторая фигура
EAE - Cesare
AEE - Camestres
EIO - Festino
AOO - Baroco
EAO - Cesaro
AEO - Cameostro
Третья фигура
AAI - Darapti
IAI - Disamis
AII - Datisi
EAO - Felapton
OAO - Bocardo
EIO - Ferison
Четвертая фигура
AAI - Bramantip
AEE - Camenes
IAI - Dimaris
EAO - Fesapo
EIO - Fresison
AEO - Cameno
Автор: Руслан 9.03.2007 18:55
Спасибо, буквально открыл глаза, ща попробую и напишу чо получилось!
И вот еще вопросик!!!! Как определить, что силлогизм неверен или частично неверен?
Автор: Michael_Rybak 9.03.2007 19:21
Цитата
Сначала определяешь M, потом S и P. Сразу получаешь фигуру...
Это что касается классификации.
А вот что касается решения.
Силлогизм записываешь в терминах теории множеств.
Код
Все А суть В - A^B = A - -A^ B пусто
Все А не суть В - A^-B = A - -A^-B пусто
Некоторые А суть В - A^ B не пусто
Некоторые А не суть В - A^-B не пусто
Некоторые А суть не В - A^-B не пусто
Ни один А не суть В - А^ B пусто
Ни один А не суть не В - А^-B = A - A^ B = не пусто
Записываешь обе предпосылки в такой форме.
Получается, у тебя есть утверждения для (M, P) и для (S, M), а тебе надо для (S, P).
Т.е. тебе нужно получить S ^ P, S ^ -P, -S ^ P, -S ^ -P. Для каждого из мы либо скажем, пусто ли оно, либо скажем, что сказать нельзя.
Для этого переберем все способы заполнения такой матрицы
Код
S M P ?
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
В каждой строке мы запишем в четвертом столбике либо "пусто", либо "не пусто", и проверим, чтобы обе предпосылки выполнялись.
Например, "не пусто", записанно в пятой строке (1 0 0) означает, что пересечение множеств S, -M и -P - не пусто.
Поскольку нас интересует результат сравнения S и P, то, если обе предпосылки выполняются, мы вычисляем S^P, S^-P, -S^P и -S^-P, постоянно накапливая результат.
Как проверять, выполняются ли предпосылки, и накапливать результат, лучше сразу посмотреть на примере.
Все люди смертны
Некоторые ученые люди
_______________
Некоторые ученые смертны.
S = ученые, M = люди, P = смертны
Пусть в переборе сейчас получена такая матрица:
Код
S M P ?
0 0 0 не пусто
0 0 1 пусто
0 1 0 пусто
0 1 1 не пусто
1 0 0 пусто
1 0 1 не пусто
1 1 0 не пусто
1 1 1 пусто
Проверим предпосылки
Все люди смертны = M ^ P = M = -М ^ P пусто
Некоторые ученые люди = S ^ M не пусто
Проверим, что -М ^ P пусто.
Выполняем операции так: V берет лучшее из двух ("пусто" хуже "не пусто").
-M ^ P = -M^P^S V -M^P^-S = S^-M^P V -S^-M^P = f(101) V f(001) = "пусто" V "пусто" = "пусто".
Проверим, что S ^ M не пусто.
S ^ M = S^M^P V S^M^-P = f(111) V f(110) = "пусто" V "не пусто" = "не пусто".
Предпосылки выполняются.
Вычисляем S^P, S^-P, -S^P и -S^-P. Рассмотрим, например, S^P.
S^P = S^P^M V S^P^-M = S^M^P V S^-M^P = f(111) V f(101) = "пусто" V "не пусто" = "не пусто".
Итак, только что получен результат: существует возможность того, что предпосылки выполняются, и S^P не пусто.
Если потом, для других вариантов заполнения матрицы (всего их 2^8), будет получен результат, существует возможность того, что предпосылки выполняются, и S^P пусто, это будет означать, что из данного силлогизма нельзя однозначно сказать, пусто ли S^P.
То же самое проделываем для S^-P, -S^P и -S^-P.
В результате получаем выводы, которые толкуем по той же таблице:
Код
Все А суть В - A^B = A - -A^ B пусто
Все А не суть В - A^-B = A - -A^-B пусто
Некоторые А суть В - A^ B не пусто
Некоторые А не суть В - A^-B не пусто
Некоторые А суть не В - A^-B не пусто
Ни один А не суть В - А^ B пусто
Ни один А не суть не В - А^-B = A - A^ B = не пусто
Твой препод довольно крут, если ему это всё (с классификацией) писать часа 3 ;)
Может он все таки хочет чтобы ты просто всё if'ами расписал? Это будет проще.
Автор: Руслан 9.03.2007 19:44
ну ты мозг! я то и подумал описывать ифами, а ща растерялся и не знаю, как закодить то что ты накатал! я не силен в программировании, недавно начал им заниматься!
Добавлено через 2 мин.
А препод действительно крут, он эту прогу писал на бэйсике, си++, прологе, паскале, а меня заставил на Делфи и красиво и тогда экзамен с отметкой олично! а при хорошем раскладе, сказал что на 5 курсе можно будет и диплом хороший написать, по этой теме!
Автор: Michael_Rybak 9.03.2007 20:36
Если ты недавно начал заниматься, то я думаю, препод как раз ждет от тебя ифов. Там их не смертельно много будет, в принципе.
Главное не запутаться ;)
Диплом - да, интересно повозиться. Хотя бы чтобы оно парсило строки. И там, окончания понимало ("ученый-ученые").
Автор: Руслан 9.03.2007 21:51
Цитата(Michael_Rybak @ 9.03.2007 23:36)
парсило строки..
Че со строками делало?
И мне нужно определить к какому модусу относится силлогизм!! Отсюда вопрос: Как проверить что в Combo Box, выбран именно интересующий нас Items?
Автор: Руслан 11.03.2007 21:34
Программу написал с тупим перебором по 19 верным модусам, в дальнейшем буду работать над привидением ее в приемлимый вид! Спасибо тебе, Михаил!
Добавлено через 9 мин.
А я вот еще думаю, как реализовать саму игру придуманную Кэрроллом, с квадратами и диаграмами!
Книжка Кэрролла "Логическая игра" прикреплена, если будут идеи делитесь!