2009-11-11 2 views
1

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

Хорошо, я собираюсь создать парсер или оценщик. Стандарт де-факто при разборе с префиксом нотации - это просто использовать стек. Добавьте в стек, если ввод - это число, если это оператор, вы можете дважды применить оператор и вернуть результат в стек.

Стек здесь будет списком, поэтому мне нужно знать, как я могу применять операторы. Ввод будет строкой. "(11 + 2 *)" Это будет 1 + 1 = 2 * 2 = 4. Сначала он читал 1 и 1 в стек. Прочтите еще 1 и добавьте его в стек. Теперь он читает «+», поэтому он дважды удаляет (поп) из стека и применяет + и возвращает результат. Прочитайте 2, поместите 2 в стек. Прочитайте *, дважды нажмите и примените *.

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

Мне особенно интересно, как нажать и поп в стеке, а также удалить, когда я иду от входной строки.

+0

выглядит довольно близко к обратной польской нотации – Simon

+0

Solved.Solved.Solved.Solved. – Algific

+0

Уход за публикацией решения? –

ответ

1

я выложу решение учителя:

% Løsning oblig 3, INF121, Høsten 2009. 
% Skrevet av: Dag Hovland 
% Opphavsrett: Universitetet i Bergen 
% Lisensiert under GPL v3, www.gnu.org. Etter tillatelse fra administrasjonen. 


% Oppgave 1 

alignment([],[],[]). 
alignment([X|Xs],[X|Ys],[X|A]) :- alignment(Xs,Ys,A). 
alignment(Xs,[_|Ys],A) :- alignment(Xs,Ys,A). 
alignment([_|Xs],Ys,A) :- alignment(Xs,Ys,A). 


maximum([X|Xs],Max) :- maximum(Xs,X,Max). 

maximum([],(X,_),X). 
maximum([X|Xs],(_,LM),MX) :- length(X,LX), LX > LM, !, maximum(Xs, (X,LX), MX). 
maximum([X|Xs],(M,LM),MX) :- length(X,LX), LX < LM, !, maximum(Xs, (M,LM), MX). 
% Pga. kuttene over vet vi at dersom tilfellene under brukes, så er 
% X akkurat like lang som lengste sett så langt 
maximum([X|Xs],_,MX) :- length(X,LX), maximum(Xs, (X,LX), MX). 
maximum([_|Xs],M,MX) :- maximum(Xs, M, MX). 

maxAlignment(Xs,Ys,A) :- findall((N,A),alignment(Xs,Ys,N,A),All),!, 
    maximum(All,(_,A)). 

% Oppgave 2 

path(S,S,_). 
path(S,End,Edges) :- select((S,Next),Edges,EdgesRest), 
    path(Next, End, EdgesRest). 

% select er innebygd. Skriv "listing(select) for å se definisjonen: 
%select(A, [A|B], B). 
%select(B, [A|C], [A|D]) :- 
% select(B, C, D). 

% polish(I,V,S) evaluates expression I to value V with stack S. 
polish([],V,[V]). 
polish(I,V,S) :- append(" ",I1,I),polish(I1,V,S). 
polish([NC|I],V,S) :- name(N,[NC]),integer(N),polish(I,V,[N|S]). 
polish(I,V,[F1,F2|S]) :- append("+",I1,I),Sum is F1+F2,polish(I1,V,[Sum|S]). 
polish(I,V,[F1,F2|S]) :- append("-",I1,I),Sum is F2-F1,polish(I1,V,[Sum|S]). 
polish(I,V,[F1,F2|S]) :- append("/",I1,I),Sum is F2/F1,polish(I1,V,[Sum|S]). 
polish(I,V,[F1,F2|S]) :- append("*",I1,I),Sum is F1*F2,polish(I1,V,[Sum|S]). 

evalPost(S,E) :- polish(S,E,[]). 

Я вывешиваю весь файл, как это. Ниже показано, как это работает:

?- evalPost("1 2 3 * +", V). 
V = 7 
?- evalPost("1 3 2 * 2 + +",V). 
V = 9 
?- evalPost("1 2 3 * 4 + +",V). 
V = 11 
?- evalPost("1 2 3 * 4 + -",V). 
V = -9 
?- evalPost("4 2/1 +",V). 
V = 3