Алгебра предикатів. Квантори

Автор работы: Пользователь скрыл имя, 26 Мая 2013 в 23:50, курсовая работа

Описание работы

Якщо числення висловлювань дає змогу доводити теореми для внутрішніх потреб логіки, то числення предикатів забезпечує можливість описувати й доводити теореми для конкретних розділів математики. Логіка предикатів дає змогу формулювати співвідношення між елементами реального світу і виводити подібні відношення або теореми в математиці. Числення висловлювань – досить вузька логічна система. Існують, наприклад, такі типи логічних міркувань, які не можуть бути здійснені в межах логіки висловлювань:
Кожний друг Івана є другом Петра. Сидір не є другом Івана. Отже, Сидір не є другом Петра.
Просте число два – парне. Отже існують прості парні числа.

Файлы: 1 файл

KursovaPredicat(Doc).doc

— 770.00 Кб (Скачать файл)

 

void printInterface()

{

cout<<"\t              *********************************\n"

<<"\t              *********************************\n"

<<"\t              **    Визначення iстинностi    **\n"

<<"\t              **     предиката на множинi    **\n"

<<"\t              **     натуральних чисел(N)    **\n"

<<"\t              **                             **\n"

<<"\t              **           Виконав           **\n"

<<"\t              **      студент групи IФ-31    **\n"

<<"\t              **         Купiч Андрiй        **\n"

<<"\t              *********************************\n"

<<"\t              *********************************\n\n";

 

cout << "Задайте, будь ласка, предикат який бажаєте перевiрити на iстинiсть:\n\n"

<< "Наприклад: 2 + 3 = 5 або 6/3- 1 < 7*4-2\n*Дозволенi символи:'0...9' '+' '-' '=' '<' '>' '<>' '<=' '>=' '*' '/' \n\nВаш предикат:";

}

 

void getNumbersNearOperand(int i, int move1, int move2, char *myString, char *get2, char* get1, int forGet2,  int forGet1, int *k2, int *k1, int *numOne, int *numTwo)

{

move1 = i;

move2 = i;

myString[i]=' ';

    while(myString[move1+1]==' ')

move1++;

for(int k=move1+1;isdigit(myString[k]);k++)

{

get2[forGet2]=myString[k];

forGet2++;

*k2=*k2+1;

myString[k]=' ';

}

*numTwo  = atoi(get2);

while(myString[move2-1]==' ')

move2 --;

for(int k=move2-1;isdigit(myString[k]);k--)

{

get1[forGet1]=myString[k];

forGet1++;

myString[k]=' ';

*k1=*k1+1;

if(k==0)

break;

}

*numOne = atoi(strrev(itoa(atoi(get1), get1,10)));

}

void getNumbersNearSpecialOperand(int i, int move1, int move2, char *myString, char *get2, char* get1, int forGet2, int forGet1, int *k2, int *k1, int *numOne, int *numTwo)

{

move1 = i;

move2 = i;

myString[i]=' ';

myString[i-1]=' ';

while(myString[move1+1]==' ')

move1++;

for(int k=move1+1;isdigit(myString[k]);k++)

{

get2[forGet2]=myString[k];

forGet2++;

*k2=*k2=1;

myString[k]=' ';

}

*numTwo  = atoi(get2);

while(myString[move2-2]==' ')

move2 --;

for(int k=move2-2;isdigit(myString[k]);k--)

{

get1[forGet1]=myString[k];

forGet1++;

myString[k]=' ';

*k1=*k1+1;

if(k==0)

break;

}

*numOne = atoi(strrev(itoa(atoi(get1), get1,10)));

}

int checkCorrectness(char *myString, char *spec, int *isCorrect)

{

for(int i =0; i<256,myString[i]!='\0' ;i++)

{

if(!isdigit(myString[i]) && myString[i]!=' ' && !strchr(spec,myString[i]))

{

cout<<"\n\nУ вашому предикатi присутнi недопустимi символи.\nПеревiрте його правильнiсть, та повторiть спробу.\n\nВаш предикат:";

*isCorrect = 0;

return 0;

}

}

return 0;

}

void checkForPresentSpec(char *myString, char *spec, int *isCorrect)

{

for(int i=0; i<7; i++)

{

if(strchr(myString,spec[i]))

*isCorrect = 0;

}

if(*isCorrect)

{

cout<<"\nДаний предикат не мiстить жодного вiдношення.\n\n";

exit(0);

}

}

void doAllMultiplication(char *myString, char *get1, char *get2, char *get3, int *k1, int *k2, int numOne, int numTwo, int *forGet1, int *forGet2, int *forGet3, int move1, int move2)

{

while(strstr(myString,"*"))

{

for(int i=0;i<256;i++)

{

if(myString[i]=='*')

{

getNumbersNearOperand(i, move1, move2, myString, get2, get1, *forGet2, *forGet1, &(*k2), &(*k1), &numOne, &numTwo);

itoa(numOne*numTwo,get3,10);

for(int k=i-*k1;isdigit(get3[*forGet3]);*forGet3=*forGet3+1)

{

myString[k]=get3[*forGet3];

k++;

}

*k1=0;

k2=0;

*forGet1=0, *forGet2=0, *forGet3=0;

break;

}

}

}

}

void doAllDivision(char *myString, char *get1, char *get2, char *get3, int *k1, int *k2, int numOne, int numTwo, int *forGet1, int *forGet2, int *forGet3, int move1, int move2)

{

while(strstr(myString,"/"))

{

for(int i=0;i<256;i++)

{

if(myString[i]=='/')

{

getNumbersNearOperand(i, move1, move2, myString, get2, get1, *forGet2, *forGet1, &(*k2), &(*k1), &numOne, &numTwo);

if(numTwo==0)

{

cout<<"\n\nДiлити на нуль заборонено! Не" можливо виконати дiю!\n\n";

exit(0);

}

itoa(numOne/numTwo,get3,10);

for(int k=i-*k1;isdigit(get3[*forGet3]);*forGet3=*forGet3+1)

{

myString[k]=get3[*forGet3];

k++;

}

*k1=0;

*k2=0;

*forGet1=0, *forGet2=0, *forGet3=0;

break;

}

}

}

}

void doAllSum(char *myString, char *get1, char *get2, char *get3, int *k1, int *k2, int numOne, int numTwo, int *forGet1, int *forGet2, int *forGet3, int move1, int move2)

{

while(strstr(myString,"+"))

{

for(int i=0;i<256;i++)

{

if(myString[i]=='+')

{

getNumbersNearOperand(i, move1, move2, myString, get2, get1, *forGet2, *forGet1, &(*k2), &(*k1), &numOne, &numTwo);

 

itoa(numOne+numTwo,get3,10);

for(int k=i-*k1;isdigit(get3[*forGet3]);*forGet3=*forGet3+1)

{

myString[k]=get3[*forGet3];

k++;

}

*k1=0;

*k2=0;

*forGet1=0, *forGet2=0, *forGet3=0;

break;

}

}

}

}

void doAllDifference(char *myString, char *get1, char *get2, char *get3, int *k1, int *k2, int numOne, int numTwo, int *forGet1, int *forGet2, int *forGet3, int move1, int move2)

{

while(strstr(myString,"-"))

{

for(int i=0;i<256;i++)

{

if(myString[i]=='-')

{

getNumbersNearOperand(i, move1, move2, myString, get2, get1, *forGet2, *forGet1, &(*k2), &(*k1), &numOne, &numTwo);

itoa(numOne-numTwo,get3,10);

for(int k=i-*k1;isdigit(get3[*forGet3]);*forGet3=*forGet3+1)

{

myString[k]=get3[*forGet3];

k++;

}

*k1=0;

*k2=0;

*forGet1=0, *forGet2=0, *forGet3=0;

break;

}

}

}

}

void checkCorrectOfOperands(char *myString, int numOne, int numTwo, int *k1, int *k2, int *forGet1, int *forGet2, int *forGet3, int move1, int move2, char *get1, char *get2)

{

while(strstr(myString,"=") || strstr(myString,">=") || strstr(myString,"<=") || strstr(myString,"<") || strstr(myString,">"))

{

for(int i=0;i<256;i++)

{

if(myString[i]=='=' && myString[i-1]!='<' && myString[i-1]!='>' )

{

getNumbersNearOperand(i, move1, move2, myString, get2, get1, *forGet2, *forGet1, &(*k2), &(*k1), &numOne, &numTwo);

 

if(numOne==numTwo)

{

cout<<"\n\nДаний предикат - iстиний.\n\n";

break;

}

else

{

cout<<"\n\nДаний предикат не є iстиним.\n\n";

break;

}

}

if(myString[i]=='<'&& myString[i+1]!='=' && myString[i+1]!='>')

{

getNumbersNearOperand(i, move1, move2, myString, get2, get1, *forGet2, *forGet1, &(*k2), &(*k1), &numOne, &numTwo);

 

if(numOne<numTwo)

{

cout<<"\n\nДаний предикат - iстиний.\n\n";

break;

}

else

{

cout<<"\n\nДаний предикат не є iстиним.\n\n";

break;

}

}

if(myString[i]=='>' && myString[i+1]!='=')

{

getNumbersNearOperand(i, move1, move2, myString, get2, get1, *forGet2, *forGet1, &(*k2), &(*k1), &numOne, &numTwo);

 

if(numOne>numTwo)

{

cout<<"\n\nДаний предикат - iстиний.\n\n";

break;

}

else

{

cout<<"\n\nДаний предикат не є iстиним.\n\n";

break;

}

}

if(myString[i]=='<' && myString[i+1]=='=')

{

getNumbersNearSpecialOperand(i+1,  move1, move2, myString, get2, get1, *forGet2, *forGet1, &(*k2), &(*k1), &numOne, &numTwo);

if(numOne<=numTwo)

{

cout<<"\n\nДаний предикат - iстиний.\n\n";

break;

}

else

{

cout<<"\n\nДаний предикат не є iстиним.\n\n";

break;

}

}

if(myString[i]=='>' && myString[i+1]=='=')

{

getNumbersNearSpecialOperand(i+1, move1, move2, myString, get2, get1, *forGet2, *forGet1, &(*k2), &(*k1), &numOne, &numTwo);

if(numOne>=numTwo)

{

cout<<"\n\nДаний предикат - iстиний.\n\n";

break;

}

else

{

cout<<"\n\nДаний предикат не є iстиним.\n\n";

break;

}

}

if(myString[i]=='<' && myString[i+1]=='>')

{

getNumbersNearSpecialOperand(i+1, move1, move2, myString, get2, get1, *forGet2, *forGet1, &(*k2), &(*k1), &numOne, &numTwo);

if(numOne!=numTwo)

{

cout<<"\n\nДаний предикат - iстиний.\n\n";

break;

}

else

{

cout<<"\n\nДаний предикат не є iстиним.\n\n";

break;

}

}

}

*k1=0;

*k2=0;

*forGet1=0, *forGet2=0, *forGet3=0;

}

 

Результати 
 

Малюнок 1

На малюнку 1 ми бачимо результат виконання програми, в якому користувач ввів предикат «12-11  +2*3 <= 99 / 11» та отримав інформацію про те, що даний предикат – істинний. 
 

Малюнок 2

На малюнку 2 показано результат, у  якому спочатку була спроба введення предиката, який містив недопустимі  символи, тому було виведено повідомлення виду - «У вашому предикаті присутні недопустимі символи» і надано можливість повторного введення предиката. 
 

Малюнок 3

На малюнку 3 ми спостерігаємо результат виконання  програми, в якому було введено  предикат «2* 9 -15 =  3/ 0», який містив ділення на нуль, у зв’язку з чим був виведена інформація про те, що «Ділити на нуль заборонено! Не можливо виконати дію» 
 

Малюнок 4

На малюнку 4 показано результат виконання програми, під час якого користувач ввів предикат, який не містив жодного відношення, після чого отримав інформацію про те, що «Даний предикат не містить жодного відношення.».

 

Висновки

Під час написання  курсової роботи, було розглянуто тематику кванторів та предикатів. Для ілюстрації розглянутого матеріалу було наведено декілька прикладів і написано програму мовою С++, яка здійснює перевірку істинності предиката.

Також по даній  темі було створено презентацію на 16 слайдів, яку можна завантажити по даному посиланню: http://db.tt/Z9zzqcv8.

 

 

Література

  1.  Ю. В. Капітонова, С. Л. Кривий, О. А. Летичевський, Г. М. Луцький, М. К. Печорін: Основи дискретної математики. – Київ, “Наукова Думка”, 2002. – 578c.
  2. Ю. М. Бардачов, Н. А. Соколова, В. Є. Ходаков:  Дискретна математика / За ред. доктора технічних наук, професора В. Є. Ходакова. – Київ: “Вища школа”, 2002. – 288c.

 


Информация о работе Алгебра предикатів. Квантори