Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Закон поглощения 
:(
    Опции темы
vijis
Дата 4.5.2017, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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.  
PM MAIL   Вверх
Google
  Дата 16.8.2017, 16:13 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума Prolog
Void
  • Пожалуйста, создавайте темы с содержательными названиями.
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Prolog | Следующая тема »


 




[ Время генерации скрипта: 0.0964 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.