Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ Логическая игра Кэрролла!

Автор: Руслан 7.03.2007 21:41

Ребяты, нужно написать программу, которая бы решала Силлогизмы, самые обыкновенные (хотя бы) с двумя посылками. Не могу разработать алгоритм! Может кто-нить может подсказать что по этому поводу, а то ощущаю себя полным дураком!

Автор: Michael_Rybak 7.03.2007 23:06

Формализовать их сначала надо. Ты ж не будешь семантику разбирать сам smile.gif

Придумай, как юзеру задавать силлогизмы. Какого вида бывают предпосылки? Надо чтоб юзер только задавал названия множеств и отношения.

Например, фраза "все кролики любят морковку, если только на них не смотрят искоса" будет для юзера выглядеть как фраза "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?

Автор: Michael_Rybak 10.03.2007 4:31

Парсило. Парсило smile.gif Ну разбирало что там в строке написано.

У комбобокса есть что-то типа SelectedItem или ItemIndex, я уже не помню. Посмотри.

Автор: Руслан 10.03.2007 5:20

Пасибо!

Автор: Руслан 11.03.2007 21:34

Программу написал с тупим перебором по 19 верным модусам, в дальнейшем буду работать над привидением ее в приемлимый вид! Спасибо тебе, Михаил! good.gif

Добавлено через 9 мин.
А я вот еще думаю, как реализовать саму игру придуманную Кэрроллом, с квадратами и диаграмами!
Книжка Кэрролла "Логическая игра" прикреплена, если будут идеи делитесь!