Форум программистов, компьютерный форум, киберфорум
Prolog
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
2 / 2 / 0
Регистрация: 30.01.2017
Сообщений: 15
1

Трансляция арифметических выражений из канонической формы в прямую (Turbo Prolog -> SWI)

28.02.2017, 09:58. Показов 505. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток, есть рабочая программа на turbo, нужно переписать на swi, не знаю как переделать работу со строками и типами данных, буду благодарен если кто-нибудь сможет помочь.

Программа транслирует арифметические выражения из канонической формы в прямую. Пример: A=(-(*(+(1,2),3),/(4,5))).
A = (1+2)*3-4/5.
Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
predicates
 
nondeterm deistvie(string,string,real).
nondeterm razdelit(string,string,string).
nondeterm zakr(string,string,string).
nondeterm poschitat(string,real,real,real).
 
clauses
/* Выбираем знак действия, раскладываем выражение на два аргумента и собираем в требуемый вид */
deistvie(S,S2,R):-
       frontstr(1,S,Z,ST),
       frontchar(ST,'(',SK),
       str_len(SK,P),
       P1=P-1,
       substring(SK,1,P1,S1),
       razdelit(S1,AR1,AR2),
       deistvie(AR1,S3,R1),
       deistvie(AR2,S4,R2),
       concat("(",S3,S5),
       concat(S5,Z,S6),
       concat(S6,S4,S7),
       concat(S7,")",S2),
       poschitat(Z,R1,R2,R).
deistvie(S,S,R):-str_real(S,R).
 
/* Подсчет арифметических действий */
poschitat("+",R1,R2,R):-R=R1+R2.
poschitat("-",R1,R2,R):-R=R1-R2.
poschitat("*",R1,R2,R):-R=R1*R2.
poschitat("/",R1,R2,R):-R=R1/R2.
 
/* Поиск запятой разделяющей аргументы с учетом парных скобок */
razdelit(S,AR1,AR2):-frontchar(S,'(',S1),
                    zakr(S1,S2,S3),
                    concat("(",S2,S5),
                    razdelit(S3,S4,AR2),
                    concat(S5,S4,AR1).
razdelit(S,"",AR2):-frontchar(S,',',AR2).
razdelit(S,AR1,AR2):-frontstr(1,S,C,S1),
                     razdelit(S1,S2,AR2),
                     concat(C,S2,AR1).
 
/* Поиск закрывающей скобки */
zakr(S,AR1,AR2):-frontchar(S,'(',S1),
                 zakr(S1,S2,S3),
                 concat("(",S2,S5),
                 zakr(S3,S4,AR2),
                 concat(S5,S4,AR1).
zakr(S,")",AR2):-frontchar(S,')',AR2).
zakr(S,AR1,AR2):-frontstr(1,S,C,S1),
                      zakr(S1,S2,AR2),
                      concat(C,S2,AR1).
/* и собсно цель программы */
goal deistvie("-(*(+(1,2),3),/(4,5))",S,R),write(S," = ",R),nl.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.02.2017, 09:58
Ответы с готовыми решениями:

Как переделать программу написанную на Turbo-Prolog в SWI-Prolog?
Ребята подскажите пожалуйста как переделать эту программу написанную на Turbo-Prolog в SWI-Prolog?...

В Turbo-Prolog есть возможность описать Goal. Как это реализовано в SWI-Prolog
Здравствуйте. в Turbo-Prolog есть возможность описать Goal: Goal father(X,_), write(X). И...

Перевод программы из Turbo Prolog в SWI-Prolog
Здравствуйте! У меня есть программа по определению внука Петра III, она написана на Turbo Prolog....

Определить, какой элемент списка встречается в нем чаще всего (Turbo/SWI Prolog)
Определить, какой элемент списка встречается в нем чаще всего.

0
28.02.2017, 09:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.02.2017, 09:58
Помогаю со студенческими работами здесь

Программирование арифметических выражений с использованием подпрограмм, размещаемых в модуле без формы
Добрый вечер всем,нужна помощь в написании программы с подпрограммой в делфи.Не понимаю как создать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru