Помощь - Поиск - Пользователи - Календарь
Полная версия: Лингвистическая Антонимическая Модель
Форум «Всё о Паскале» > Pascal, Object Pascal > Написание игр
Чужак
Тема не игровая,может ближе к задачам, но именно в Играх завязываются коллективные проекты,
поэтому решил разместиться здесь.
Сначала теория. Человеский естественный язык, речь, согласно данным современной лингвистики весьма структурирована и насыщена различными структурами.
В языке можно выделить, например, такие понятийные пласты:
1. Классификационные понятия. Обычные понятия обычного разговорного языка, отражающие предметное многообразие мира вокруг нас. Около 100-200 тыс.слов.
(Дом, стол, стул, дерево-это все они. Могут иметь множество уровней вложенности, но здесь речь не о них).
2. Антонимы, или бинарные оппозиции. Отражают противоположные качества либо стороны предметов.
(жесткий-мягкий, холодный-горячий, длинный короткий и т.д.
Сам насобирал около 30 пар).
Ну, теперь дошел до проектной части. Решил создать программу, народобие тестов, но с более сложной лингвистической и логической структурой. (Пока речь не о коде Паскаля, а логической упорядоченности).
Пользователь вводит свое имя и название объекта, допустим "сад", затем программа спрашивает у него
"Сад большой или маленький?" С вариантами ответа,
затем, к примеру "темный или светлый?" ит.д.
В конце выдает "сад большой/светлый".
Вот что получилось...

Program AntonimicheskajaModel;
Uses Crt;
Var a:char; i1,i2,p1,p2:integer;
m:array[0..100] of string;
c,ob,s:string;
begin {program}
m[1]:='БОЛЬШОЙ'; m[2]:='МАЛЕНЬКИЙ'; m[3]:='НЕ БОЛЬШОЙ, НЕ МАЛЕНЬКИЙ';
m[4]:='И БОЛЬШОЙ, И МАЛЕНЬКИЙ'; m[5]:='СКОРЕЕ БОЛЬШОЙ';
m[6]:='СКОРЕЕ МАЛЕНЬКИЙ';
m[7]:='ТВЕРДЫЙ'; m[8]:='МЯГКИЙ';m[9]:='НЕ ТВЕРДЫЙ, НЕ МЯГКИЙ';
m[10]:='И ТВЕРДЫЙ, И МЯГКИЙ'; m[11]:='СКОРЕЕ ТВЕРДЫЙ';
m[12]:='СКОРЕЕ МЯГКИЙ';
writeln ('КАК ВАШЕ ИМЯ?');
readln©;
writeln (' НАЗВАНИЕ ОБЪЕКТА ИЗУЧЕНИЯ?');
readln(ob);
writeln(' ЗДРАВСТВУЙТЕ, ',c);
writeln(' ПРИСТУПИМ К ИЗУЧЕНИЮ ОБЪЕКТА " ',ob,' "(Y/N)?');
readln(a);
if a='y' then
begin
writeln(' ОБЪЕКТ БОЛЬШОЙ ИЛИ МАЛЕНЬКИЙ?');
writeln(' ВАРИАНТЫ ОТВЕТА:');
writeln(' 1-БОЛЬШОЙ, 2-МАЛЕНЬКИЙ ');
writeln(' 3-НЕ БОЛЬШОЙ, НЕ МАЛЕНЬКИЙ, 4-И БОЛЬШОЙ, И МАЛЕНЬКИЙ ');
writeln(' 5-СКОРЕЕ БОЛЬШОЙ, 6-СКОРЕЕ МАЛЕНЬКИЙ ');
read(p1); i1:=p1;
writeln(' ОБЪЕКТ ТВЕРДЫЙ ИЛИ МЯГКИЙ?');
writeln(' ВАРИАНТЫ ОТВЕТА:');
writeln(' 1-ТВЕРДЫЙ , 2-МЯГКИЙ ');
writeln(' 3-НЕ ТВЕРДЫЙ , НЕ МЯГКИЙ, 4-И ТВЕРДЫЙ, И МЯГКИЙ ');
writeln(' 5-СКОРЕЕ ТВЕРДЫЙ, 6-СКОРЕЕ МЯГКИЙ ');
read(p2); i2:=p2+6;
if p1=i1 then begin
writeln('******************');
writeln('ОБЪЕКТ ',ob,' ' , m[i1]);
writeln( m[i2]);
end;
end;
if a='n' then writeln(' ПРОЩАЙТЕ ',c);
readkey;
end.


Предлагаю тему к коллективной разработке.
Для этого прошу:
1. Код программы. По моему, его улучшать и улучшать. Критикуйте.
2. Антонимы. Кто нибуть знает, где в Интернет взять электронный словарь антонимов?
Либо помогите с поиском yes2.gif Желательно иметь запас штук сто.
3. Ваше мнение?
Lapp
Цитата(Чужак @ 22.03.2007 0:26) *

3. Ваше мнение?

Если не включать в проект возможность принятия решений, то это всего лишь семантика, реляционная база данных..
Если включить... то это может быть все, что угодно smile.gif. ИИ, одним словом.
Первое решаемо - хотя не стану утверждать, что просто - и не очень интересно.
Второе - неосуществимо.. зато интересно!

Но первое может стать частью второго.. smile.gif
Чужак
Цитата(Lapp @ 22.03.2007 2:09) *

Если не включать в проект возможность принятия решений, то это всего лишь семантика, реляционная база данных..
Если включить... то это может быть все, что угодно smile.gif. ИИ, одним словом.

Кто принимает решения-
пользователь или программа?
Lapp
Цитата(Чужак @ 22.03.2007 23:43) *

Кто принимает решения- пользователь или программа?

Прога, конечно! blink.gif пользователь лежит и плюет в потолок.. smile.gif))
Извини, я просто хотел сказать, что сам по себе разбор, который ты делаешь, непонятно зачем нужен. Вот я и попытался пофантазировать на тему ИИ..
Да, именно программа должна принимать решения. Какие именно - другой вопрос... smile.gif
Чужак
Цитата(Lapp @ 23.03.2007 1:10) *

Извини, я просто хотел сказать, что сам по себе разбор, который ты делаешь,
непонятно зачем нужен.

Непонятно зачем нужен mad.gif
Напиши 100 антонимов и прочти мою подпись blum.gif
Естественный язык структурирован и отражает мир.
Программа помогает пользователю построить
модель интересующего его объекта.

Lapp
Цитата(Чужак @ 23.03.2007 1:34) *

Непонятно зачем нужен mad.gif

Не сердись.. я забыл добавить "имхо" smile.gif.
То есть это некая модель информационного пространства? семантическая, с описаниями возможных характеристик?
Чужак
Цитата(Lapp @ 23.03.2007 1:46) *

То есть это некая модель информационного пространства?
семантическая, с описаниями возможных характеристик?

ДА. Она основана на способности человека
осознавать и отображать окружающий мир в понятиях.
Паскаль-скорее инструмент создания.
Archon
Не думаю, что можно классифицировать объекты антонимами, так как все эти понятия (большой-маленький, короткий-длинный) очень относительны. Например я могу сказать, что объект горячий только сравнив его с другим. А ты пытаешься использовать антонимы так, как будто их значения имеют смысл сами по себе...
Чужак
Archon, хорошее замечание.
Но ты прав лишь частично.
Язык ведь описывает мир? Каждое понятие
несет "зазмазанный круг смыслов", оно астрактно,
но, если точно подбирать слова, точность описания возрастает.
Вообще, этим вопросом занималась философия, начиная с досократиков, затем Сократ, средневековые споры "номиналистов" с "реалистами", немецкая классическая философия, марксиская философия.
Разные школы отвечали на него по разному...
В последней (вообще я далеко не марксист, и не материалист, но некоторые наработки советских философов из-за этого не выбрасываю) этот вопрос решался как "расхождение от абстрактного к конкретному", происходящий пошагово.
Но подвигаю философию в сторону. Абсолютного решения эта задача не имеет, но имеет практические аспекты.
Выкладываю улучшенную версию программы,
Используются бинарные пары "большой-маленький",
"теплый-холодный ", "белый-черный" и "жесткий-мягкий". "

Program AntonimicheskajaModel2;
Uses Crt;
Var a:char;
i1,p1,i2,p2,i3,p3,i4,p4:integer;
m:array[0..100] of string;
c,ob:string;
begin {program}
m[1]:='БОЛЬШОЙ'; m[2]:='МАЛЕНЬКИЙ';
m[3]:='НЕ БОЛЬШОЙ, НЕ МАЛЕНЬКИЙ'; m[4]:='И БОЛЬШОЙ, И МАЛЕНЬКИЙ
m[5]:='СКОРЕЕ БОЛЬШОЙ'; m[6]:='СКОРЕЕ МАЛЕНЬКИЙ';
{***********************}
m[7]:='ТЕПЛЫЙ'; m[8]:='ХОЛОДНЫЙ';
m[9]:='НЕ ТЕПЛЫЙ, НЕ ХОЛОДНЫЙ'; m[10]:='И ТЕПЛЫЙ, И ХОЛОДНЫЙ';
m[11]:='СКОРЕЕ ТЕПЛЫЙ'; m[12]:='СКОРЕЕ ХОЛОДНЫЙ';
{***********************}
m[13]:='БЕЛЫЙ'; m[14]:='ЧЕРНЫЙ';
m[15]:='НЕ БЕЛЫЙ, НЕ ЧЕРНЫЙ'; m[16]:='И БЕЛЫЙ, И ЧЕРНЫЙ';
m[17]:='СКОРЕЕ БЕЛЫЙ'; m[18]:='СКОРЕЕ ЧЕРНЫЙ';
{***********************}
m[19]:='ЖЕСТКИЙ'; m[20]:='МЯГКИЙ';
m[21]:='НЕ ЖЕСТКИЙ, НЕ МЯГКИЙ'; m[22]:='И ЖЕСТКИЙ, И МЯГКИЙ';
m[23]:='СКОРЕЕ ЖЕСТКИЙ'; m[24]:='СКОРЕЕ МЯГКИЙ';
{***********************}
writeln ('КАК ВАШЕ ИМЯ?');
readln©;
writeln (' НАЗВАНИЕ ОБЪЕКТА ИЗУЧЕНИЯ?');
readln(ob);
writeln(' ЗДРАВСТВУЙТЕ, ',c);
writeln(' ПРИСТУПИМ К ИЗУЧЕНИЮ ОБЪЕКТА " ',ob,' "(Y/N)?');
readln(a);
if a='y' then
begin
writeln(' ОБЪЕКТ БОЛЬШОЙ ИЛИ МАЛЕНЬКИЙ?');
writeln(' ВАРИАНТЫ ОТВЕТА:');
writeln(' 1-БОЛЬШОЙ, 2-МАЛЕНЬКИЙ ');
writeln(' 3-НЕ БОЛЬШОЙ, НЕ МАЛЕНЬКИЙ, 4-И БОЛЬШОЙ, И МАЛЕНЬКИЙ ');
writeln(' 5-СКОРЕЕ БОЛЬШОЙ, 6-СКОРЕЕ МАЛЕНЬКИЙ ');
read(p1); i1:=p1; clrscr;
writeln(' ОБЪЕКТ ТЕПЛЫЙ ИЛИ ХОЛОДНЫЙ?');
writeln(' ВАРИАНТЫ ОТВЕТА:');
writeln(' 1-ТЕПЛЫЙ, 2- ХОЛОДНЫЙ');
writeln(' 3-НЕ ТЕПЛЫЙ, НЕ ХОЛОДНЫЙ, 4-И ТЕПЛЫЙ, И ХОЛОДНЫЙ ');
writeln(' 5-СКОРЕЕ ТЕПЛЫЙ, 6-СКОРЕЕ ХОЛОДНЫЙ ');
read(p2); i2:=p2+6; clrscr;
writeln(' ОБЪЕКТ БЕЛЫЙ ИЛИ ЧЕРНЫЙ ?');
writeln(' ВАРИАНТЫ ОТВЕТА:');
writeln(' 1-БЕЛЫЙ, 2- ЧЕРНЫЙ');
writeln(' 3-НЕ БЕЛЫЙ, НЕ ЧЕРНЫЙ, 4-И БЕЛЫЙ, И ЧЕРНЫЙ ');
writeln(' 5-СКОРЕЕ БЕЛЫЙ, 6-СКОРЕЕ ЧЕРНЫЙ ');
read(p3); i3:=p3+12; clrscr;
writeln(' ОБЪЕКТ ИЛИ ?');
writeln(' ВАРИАНТЫ ОТВЕТА:');
writeln(' 1-ЖЕСТКИЙ, 2- МЯГКИЙ');
writeln(' 3-НЕ ЖЕСТКИЙ, НЕ , 4-И ЖЕСТКИЙ, И МЯГКИЙ ');
writeln(' 5-СКОРЕЕ ЖЕСТКИЙ, 6-СКОРЕЕ МЯГКИЙ ');
read(p4); i4:=p4+18; clrscr;
if p1=i1 then begin
writeln('******************');
writeln('ОБЪЕКТ ',ob, ' ',m[i1]);
writeln(m[i2]);
writeln(m[i3]);
writeln(m[i4]);
end;
end;
if a='n' then writeln(' ПРОЩАЙТЕ ',c);
readkey; clrscr;
end.

volvo
Цитата
Абсолютного решения эта задача не имеет, но имеет практические аспекты.
Какие? Все, что я вижу на данный момент - это просто ввод 4-х чисел, и вывод элементов массива, соответствующих этим числам... Все... Причем то же самое можно сделать в 3 раза короче.

Смысл твоей программы? Что она делает с парой "большой-маленький"? Она ее (а не название) использует как-то?
Чужак
Блин, ошибся. В строке

m[4]:='И БОЛЬШОЙ, И МАЛЕНЬКИЙ


Надо поставить ';

m[4]:='И БОЛЬШОЙ, И МАЛЕНЬКИЙ';


Сорру unsure.gif


Чужак
Тысяча извинений за опечатки...

read(p3); i3:=p3+12; clrscr;
writeln(' ОБЪЕКТ ИЛИ ?');
writeln(' ВАРИАНТЫ ОТВЕТА:');


Должно быть

read(p3); i3:=p3+12; clrscr;
writeln(' ОБЪЕКТ ЖЕСТКИЙ ИЛИ МЯГКИЙ?');
writeln(' ВАРИАНТЫ ОТВЕТА:');


А "расхождение от абстрактного к конкретному"
надо читать как "восхожение от абстрактного к конкретному"
Чужак
Archon, забыл сказать одну важную вещь. Понятия можно сравнивать друг с другом. Так можно получить не только антонимы, но и градации по убыванию либо возрастанию одного и того же качества. Это более сложное явление, ГРАДУАЛЬНАЯ АНТОНИМИЯ, решил её пока не включать.
Вот смотри...(Пример не 100% корректен и единицы в нем условны-у.е. , но не U$D/Шутка/)
прекрасный(+5)-очаровательный(+4)-красивый(+3)-замечательный(+2)-хороший(+1)-обычный(0)-посредственный(-1)-неприглядный(-2)-плохой(-3)-скверный(-4)-безобразный(-5).
Многоуважаемый модератор Volvo!
Цитата(volvo @ 24.03.2007 23:33) *

Какие? Все, что я вижу на данный момент - это просто ввод 4-х чисел, и вывод элементов массива, соответствующих этим числам... Все... Причем то же самое можно сделать в 3 раза короче.
Смысл твоей программы?

Смысл моей программы-"автоматизация и формализация логических
операций". Ты её запускал или только бегло просмотрел код?
Она корявовата, но логико-семантические цепочки, которые она строит, не в счет?
Формальная логика позволяет выполнять действия над понятиями, как математика над числами, как компилляция над кодами (ИМХО).
А что касается
Цитата
Что она делает с парой "большой-маленький"?
Она ее (а не название) использует как-то?

то не всё сразу...
Вот версия программы, которая использует, а кроме того,
строит инверсную модель, с обращением характеристик объекта
в противоположные.

Program AntonimicheskajaModel3;
Uses Crt;
Var a:char;
i1,p1,i2,p2,i3,p3,i4,p4:integer;
m:array[0..100] of string;
c,ob:string;
begin {program}
{здесь все, как в предидущем варианте}
................................
if p1=i1 then begin
writeln('******************');
writeln('ОБЪЕКТ ',ob, ' ',m[i1]);
writeln(m[i2]); writeln(m[i3]); writeln(m[i4]);
end;
if frac(p1/2)>0 then i1:=i1+1 else i1:=i1-1;
if frac(p2/2)>0 then i2:=i2+1 else i2:=i2-1;
if frac(p3/2)>0 then i3:=i3+1 else i3:=i3-1;
if frac(p4/2)>0 then i4:=i4+1 else i4:=i4-1;
writeln('******************');
writeln('ОБРАЩЕННЫЙ (ИНВЕРСНЫЙ) ОБЪЕКТ ',ob, ' ',m[i1]);
writeln(m[i2]); writeln(m[i3]); writeln(m[i4]);
end;
if a='n' then writeln(' ПРОЩАЙТЕ ',c);
readkey; clrscr;
end.

volvo
Замечание о РАЗМЕРЕ ты предпочел оставить без внимания?

Представим, что в ЭТУ же программу тебе надо добавить еще 4 пары антонимов и КАЖДЫЙ из них будет классифицироваться не по 6, а по 8 градациям... Вопрос: сколько мест в программе ты вынужден будешь менять?
Чужак
Цитата(volvo @ 25.03.2007 17:55) *

Замечание о РАЗМЕРЕ ты предпочел оставить без внимания?

Представим, что в ЭТУ же программу тебе надо добавить еще 4 пары антонимов и КАЖДЫЙ из них будет классифицироваться не по 6, а по 8 градациям... Вопрос: сколько мест в программе ты вынужден будешь менять?

Я признал, и признаю еще раз, что код корявенький.
Я старался, чтобы работала МОДЕЛЬ.
Приму любые предложения по оптимизации кода.
Но логическая структура МОДЕЛИ не должна ломаться.
Над возможностью внесения в программу процедур,
функций или др. сейчас думаю.

Чужак
В замечании модератора volvo увидел потаенный смысл.
Стоп! Сам себе думаю...
Да, линейная структура моей программы ограничена.
Прогу надо делать на массивах, файлах или процедурах, с циклами.
Решил сделать на массивах и циклах, с заполнением с клавиатуры.
Когда он намекал на это, то наверно подразумевал нечто
подобное (а может, гораздо лучше). Если это так,
то БОЛЬШОЙ ПРОФЕССИОНАЛ этот volvo.
(Но и зануда он тоже не малая...) cool.gif
Вот программа:

program AntonimSyperModel;
uses crt;
const t=6;
var i,j,k,l:integer; a:char;
m:array[0..20] of string;
n:array[0..100] of string;
d:array[0..20] of integer;
c,ob:string;
begin
clrscr; i:=0; j:=0; k:=0; l:=0;
writeln('ВВЕДИТЕ АНТОНИМЫ');
while (i<t) do
begin
readln(m[i]); i:=i+1;
end;
while (j<t) do
begin
n[j]:='Не '+m[j]+' Не '+m[j+1]; n[t+j]:=' И '+m[j]+' И '+m[j+1];
n[2*t+j]:='СКОРЕЕ '+m[j]; n[3*t+j]:='СКОРЕЕ '+m[j+1];
j:=j+2;
end;
clrscr;
writeln ('КАК ВАШЕ ИМЯ?');
readln©;
writeln (' НАЗВАНИЕ ОБЪЕКТА ИЗУЧЕНИЯ?');
readln(ob);
writeln(' ЗДРАВСТВУЙТЕ, ',c);
writeln(' ПРИСТУПИМ К ИЗУЧЕНИЮ ОБЪЕКТА " ',ob,' "(Y/N)?');
readln(a);
if a='y' then
begin
clrscr;
while (k<t) do begin
writeln('ОБЪЕКТ " ',ob,'" ',m[k], ' ИЛИ ', m[k+1] );
writeln('ВАРИАНТЫ ОТВЕТА');
writeln('1- ', m[k]); writeln('2- ',m[k+1]);
writeln('3- ', n[k]); writeln('4- ',n[k+t]);
writeln('5- ', n[k+2*t]); writeln('6- ', n[k+3*t]);
readln(d[k]); clrscr;
k:=k+2;
end;
clrscr;
writeln('ОБЪЕКТ " ',ob,' "');

while (l<t) do begin
if d[l]=1 then writeln(m[l]);
if d[l]=2 then writeln(m[l+1]);
if d[l]=3 then writeln(n[l]);
if d[l]=4 then writeln(n[l+t]);
if d[l]=5 then writeln(n[l+2*t]);
if d[l]=6 then writeln(m[l+3*t]);
l:=l+2;
end;

end;
if a='n' then writeln(' ПРОЩАЙТЕ ',c);
readkey; clrscr;
end.


Просьба к читающим.
1. Потестируйте, пожалуйста, программу.
2. Накидайте антонимов!
3. Ваше мнение?
Чужак
Решил сам выложить последнюю (на данный момент)
версию программы с результатами тестов.
Добавлена операция "АНТИНОМИИ" (не путать с антонимией!).
Нажмите для просмотра прикрепленного файла
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.