|
|
|
vijis |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 4.5.2017 Репутация: нет Всего: нет |
Здравствуйте! У меня есть готовая программа, которая осуществляет упрощение по закону поглощения и работает только если вводишь его и ничего другого. Иначе не так робит. Т.е. вводишь например (a&b)&((a&b)|c) или a|(a&c), то упрощается. А если добавить в программу ещё что-то, например (a&b)&((a&b)|c)|d то она ломается и выводит в ответе всё выражение. Мне нужно исправить её так, чтобы из всего выражения написанного, оно вычленяло ту часть, где упрощается по закону поглощения, а оставшуюся добавляла. Помогите пожалуйста, не шарю совсем в Prolog. И если можно, то объясните как работает программа, а именно: тип данных exp - зарезервированный или нет? Как строится бинарное дерево?
DOMAINS exp=aand(exp,exp); oor(exp,exp); nnot(exp); str(string) PREDICATES expres(string,string,exp). % Для анализа 3-х типов выражения term(string,string,exp). % Терм представляющий либо имя, либо выражение sign(string,string,string). % Определяет знак операции make_exp(string,exp,exp,exp). % Формирует бинарное дерево single(string). % Допустимые знаки операций var(string,string,string). % Проверка принадлежности операнда символам латинского алфавита lvalue(string,string,string,integer). wr_exp(exp). % Вывод выражения w_e(exp). edit_exp(exp,exp). % Упрощение выражения по закону поглощения errors(string,integer,integer). % Проверка на ошибки errors1(string,integer,integer). if_else(integer,string). if_else1(integer,string). CLAUSES % Проверка выражения на ошибочные символы errors("",0,F1):-F1=1. errors("",_,_). errors(S,F,F1):- frontchar(S,C,Q), C='(',F1=0,errors(Q,F,F1),!. errors(S,F,F1):- frontchar(S,C,Q), C=')',F1=0,errors(Q,F,F1),!. errors(S,F,F1):- frontchar(S,C,Q), C='!',F1=0,errors(Q,F,F1),!. errors(S,F,F1):- frontchar(S,C,Q), C='&',F1=0,errors(Q,F,F1),!. errors(S,F,F1):- frontchar(S,C,Q), C='|',F1=0,errors(Q,F,F1),!. errors(S,F,F1):- frontchar(S,C,Q), char_int(C,I), I>=97, I<=122,F1=0,errors(Q,F,F1),!. errors(_,F,F1):-F1=F+1. % Проверка на соответствие открывающих и закрывающих скобок errors1("",0,C1):-C1=0. errors1(S,N,C1):- frontchar(S,C,Q), C='(',N1=N+1,errors1(Q,N1,C1),!. errors1(S,N,C1):- frontchar(S,C,Q), C=')',N1=N-1,errors1(Q,N1,C1),!. errors1(S,N,C1):- frontchar(S,C,Q),errors1(Q,N,C1). errors1(_,C,C1):-C1=C+10. % Выводим Neverni simvol в случае наличия неверного символа. Иначе запускаем проверку на соответствие скобок if_else(F,_):- F<>0,write("Error. Neverni simvol.!!!"),!. if_else(_,Z):- C=0, R=Z, errors1(Z,C,C1), if_else1(C1,R). % Выводим Ne sootvetstvie skobok в случае не соответствия скобок. Иначе строим бинарное дерево if_else1(C,_):- C<>0,write("Error. Ne sootvetstvie skobok!!!"),!. if_else1(_,Y):- expres(Y,A,B), edit_exp(B,B1), write("Otvet: "), wr_exp(B1),!. % Построение бинарного дерева expres(Str,Rest,Expr):- term(Str,Rest1,Expr1), sign(Rest1,FS,Rest2), expres(Rest2,Rest,Expr2), make_exp(FS,Expr1,Expr2,Expr). expres(Str,Rest,Expr):- term(Str,Rest,Expr). expres(Str,Rest,nnot(Expr)):- frontchar(Str,'!',Rest1), term(Rest1,Rest,Expr). sign(Str,FS,Rest):- frontstr(1,Str,FS,Rest),single(FS). Single("|"). Single("&"). make_exp("&",E1,E2,aand(E1,E2)):-!. make_exp("|",E1,E2,oor(E1,E2)):-!. term (Str,Rest,str(S)):- var(Str,Rest,S),!. term (Str,Rest,Expr):- frontchar(Str,'(',Rest1), expres (Rest1,Rest2,Expr), frontchar (Rest2,')',Rest). var(Str,Rest, Val):- lvalue(Str,Rest,Val,0),Val<>"". lvalue(Str,Rest,Val,N):- frontchar (Str,FC,Rest1), char_int(FC,FI), FI>=97, FI<=122,N<1,!, N1=N+1, lvalue(Rest1,Rest,Val1,N1), Str_char(FS,FC), concat (FS,Val1,Val). lvalue(Str,Str,"",1). % Упрощение по закону поглощения edit_exp(str(E),str(E)). edit_exp(oor(E1,aand(E1,_)),Exp):- edit_exp(E1,Exp),!. edit_exp(oor(E1,aand(E1,E2)),E1). edit_exp(oor(aand(E1,_),E1),Exp):- edit_exp(E1,Exp),!. edit_exp(oor(aand(E1,E2),E1),E1). edit_exp(aand(E1,oor(E1,_)),Exp):- edit_exp(E1,Exp),!. edit_exp(aand(E1,oor(E1,E2)),E1). edit_exp(aand(oor(E1,_),E1),Exp):- edit_exp(E1,Exp),!. edit_exp(aand(oor(E1,E2),E1),E1). edit_exp(oor(E1,E2),oor(E1,E2)). edit_exp(aand(E1,E2),aand(E1,E2)). edit_exp(nnot(E1),nnot(E1)). % Вывод конечного результата wr_exp(aand(E1,E2)):- w_e(E1),write("&"), w_e(E2). wr_exp(oor(E1,E2)):- w_e(E1), write("|"), w_e(E2). wr_exp(nnot(E)):- write("!"), w_e(E). wr_exp(str(S)):- w_e(str(S)). w_e(str(S)):- write(S). w_e(E):- write("("), wr_exp(E), write(")"). GOAL makewindow(1,7,7,"Preobrazovanie formi predstavlenia logical virajenja",0,0,25,80), cursor(1,4), nl, write(" Uproshenie po zakonu poglosheniya: Autor raboti: student V.A. Pechurin"), nl, write(" Group: 14vi1 "), nl, write(" Penza, 2017"), nl, write(" Primer vchodnich dannich:"), nl, write(" (a&b)&((a&b)|c)"), nl, cursor(15,4), write("Vvedite virajenie"), cursor(16,12), readln(Y), R=Y, Z=Y, nl, F=0, errors(R,F,F1), if_else(F1,Z), nl. |
|||
|
||||
hotpotothers |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 2.3.2023 Репутация: нет Всего: нет |
Если матрица небольшая то вопрос легко решается вручную, но вот если компонентов много, то уже проблема free games.
|
|||
|
||||
ClezeripLover |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 20.8.2022 Репутация: нет Всего: нет |
Модератор: Сообщение скрыто. |
|||
|
||||
ClezeripLover |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 20.8.2022 Репутация: нет Всего: нет |
Модератор: Сообщение скрыто. |
|||
|
||||
Правила форума Prolog | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Prolog | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |