0 / 0 / 2
Регистрация: 27.12.2010
Сообщений: 24
1

Не могу доработать, работа со списками

12.06.2012, 20:06. Показов 887. Ответов 2
Метки нет (Все метки)

доброго вечерочка!
написал программу:
задача:Преобразовать конструкцию языка Си++ вида
C++
1
2
3
switch (x){
case 1: y=45;break;
case 2: y=34;break;}
в соответствующую конструкцию языка Паскаль.
Pascal
1
2
3
4
case x of
1: y:=45;
2: y:=34;
end;
текст программы на прологе:
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
 % Lw=word list
% w,wl = one word   
% Lc = char list 
% C,C1 = single char 
 
%trace dtm
domains
    c=char 
    w=symbol 
    lc=c* 
    lw=w* 
 
predicates
        moi(w,lw,lw)
    name(w,lc) 
    cname(w,lc)
    read_sent (lw) 
    rest_of_sent(w,c,lw) 
    readword(c,w,c) 
    rest_of_word(c,lc,c) 
    point(c) 
    tol_char(c) 
    sbound(w) 
%   dtm(w,lw,lw)
    conc(lw,lw,lw)
    write_list(lw)
 
clauses
 
    read_sent([W|Lw]) :-    % считать предложение
        readchar(C),write(C), 
        readword(C,W,Cl), 
        rest_of_sent(W,Cl,Lw),!.
 
% предыдущее слово и следующий символ введены; 
% считать оставшуюся часть предложения.
rest_of_sent(W,_,[]) :- sbound(W),!. 
 
% конец, если предыдущим
% словом была граница 
% предложения
 
rest_of_sent(_,C,[Wl|Lw]) :-
    readword(C,Wl,Cl), 
    rest_of_sent(Wl,Cl,Lw).
 
% взять начальный символ, прочитать слово, 
% возвратить следующий символ
readword(C,W,C1) :-
    point(C),!,
    name(W,[C]),    % построить слово
    readchar(C1),write(C1).
 
readword(C,W,C1) :-
    tol_char(C),!, 
    readchar(C2),write(C2), 
    rest_of_word(C2,Lc,C1), % считать след, символы 
    name(W,[C|Lc]).           % построить слово
 
readword(_,W,C1) :-
    readchar(C2),write(C2), % символ С недопустим 
    readword(C2,W,C1).      % ввести следующий символ
                % и попытаться повторить
 
 
% расширять слово до тех пор, пока 
% не встретится недопустимый символ
rest_of_word(C,[C|Lc],C1) :-      % объединить символы
    tol_char(C),!,            % в список 
    readchar(C2),write(C2), 
    rest_of_word(C2,Lc,C1).
 
rest_of_word(C,[],C).   % конец слова, если
                        % С - недопустимый символ
 
%создание слова W из списка символов
name(W,[H]) :-  str_char(W,H). 
 
name(W,[H|Tail]) :-
    name(Wtail,Tail),
    frontchar(W,H,Wtail).
 
%создание списка символов из слова
cname(W,[H|Tail]) :-  
    frontchar(W,H,Wtail),!,
    cname(WTail,Tail). 
 
cname("",[]).
 
% символы, считающиеся самостоятельными словами
point(44).  % ,
point(59).  % ;
point(58).  % :
%point(63).  ?
%point(33).  !
point(46).  % .
point(91).  % [
point(93).  %]   
point(45).  % -
point(40). %(   
point(41). %)   
point('{').
point('}').
point('=').
point('*').
point('/').
point('+').
point('<').
point('>').
 
 
 
 
 
% диапазоны кодов допустимых символов
 
tol_char(I) :- I>96,I<123. % а - z 
tol_char(I) :- I>64,I<91. % А - Z 
tol_char(I) :- I>47,I<58. % 0 - 9
 
% знаки пунктуации, заканчивающие предложение
 
 
sbound("."). 
 
%-------------------------------------------------------
 
moi(nach,Id,Im) :-
    conc(["switch","("],S1,Id),
    conc(["case "],S1,S),
    moi(rr,S,Im).
    
moi(rr,Id,Im) :-
    conc(S1,[")","{","case"|S2],Id),
    conc(S1,[" of "|S2],S),
    moi(rrr,S,Im).
 
    
moi(rrr,Id,Im) :-
    conc(S1,["case"|S2],Id),
    conc(S1,[" "|S2],S),
    moi(sss,S,Im).
        
moi(sss,Id,Im) :-
    conc(S1,["break",";"|S2],Id),
    conc(S1,[" "|S2],S),
    moi(ss,S,Im).
 
moi(ss,Id,Im) :-
    conc(S1,["="|S2],Id),
    conc(S1,[":","="|S2],S),
    moi(ss2,S,Im).
    
moi(ss2,Id,Im) :-
    conc(S1,["}"|S2],Id),
    conc(S1,[" end; "|S2],Im).  
 
 
conc([],L,L).
conc([X|L1],L2,[X|L3]) :- conc(L1,L2,L3).
 
write_list([]):-nl.
write_list([H|T]) :- write(H), write_list(T).
 
 
 
goal 
    write("\n Sent: "), 
    read_sent(W), 
    moi(nach,W,MW),
    nl,write_list(W),
    nl,write_list(MW).
программа работает, но не корректно, она возвращает много значений, вместо "сляпанного" из них одного истинного.
P.S.
ошибки, я думаю, следует искать после строки 127, т.к. там начинается преобразование языков!
Прошу помогите, не хочется из-за пустяка вылетать с 4 курса((

Добавлено через 2 часа 14 минут
прошу не пугаться длинного кода, сегмент требующий доработки составляет 30 строк, и проблема только с конкатенацией...
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.06.2012, 20:06
Ответы с готовыми решениями:

Работа со списками. В чем такая глупая ошибка не могу найти?
В чем такая глупая ошибка не могу найти? program sp; type {Тип основных данных.} TElem=real;...

Не могу разобраться со списками
Как можно перебрать операторо if значения списка Choice. Нужен вот такой синтаксис: if (позиция...

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

Работа со списками
Здравствуйте! Подскажите, пожалуйста, как переделать ghci&gt; , y &lt;– ] в функцию, чтобы можно...

2
2504 / 1478 / 37
Регистрация: 14.09.2009
Сообщений: 2,740
12.06.2012, 21:55 2
Да конкатенация не проблема
Prolog
1
2
to_string([],"").
to_string([H|Tail],S):-to_string(Tail,S1),fronttoken(S,H,S1).
Но у Вас по-моему сам разбор ошибки содержит, например почему-то появляются две скобочки перед x.
0
0 / 0 / 2
Регистрация: 27.12.2010
Сообщений: 24
13.06.2012, 08:02  [ТС] 3
прошу прощения, но где вы нашли этот кусочек кода?

Добавлено через 21 минуту
и что за 2 скобочки перед Х?

Добавлено через 8 минут
вот что выводит у меня и нет ни каких скобочек!

Sent: switch (x) {
case 1:y=45;break;
case 2:y=34;break;}.

switch(x){case1:y=45;break;case2:y=78;break;}.

case x of 1:y:=45; 2:y=34;break; end; .
W=["switch","(","x",")","{","case","1",":","y","=","4 5",";","break",";","case","2",":","y","=","34",";" ,"break",";","}","."], MW=["case ","x"," of ","1",":","y",":","=","45",";"," "," ","2",":","y","=","78",";","break",";"," end; ","."]

switch(x){case1:y=45;break;case2:y=34;break;}.

case x of 1:y=45; 2:y:=34;break; end; .
W=["switch","(","x",")","{","case","1",":","y","=","4 5",";","break",";","case","2",":","y","=","34",";" ,"break",";","}","."], MW=["case ","x"," of ","1",":","y","=","45",";"," "," ","2",":","y",":","=","34",";","break",";"," end; ","."]

switch(x){case1:y=45;break;case2:y=78;break;}.

case x of 1:y:=45;break; 2:y=78; end; .
W=["switch","(","x",")","{","case","1",":","y","=","4 5",";","break",";","case","2",":","y","=","34",";" ,"break",";","}","."], MW=["case ","x"," of ","1",":","y",":","=","45",";","break",";"," ","2",":","y","=","34",";"," "," end; ","."]

switch(x){case1:y=45;break;case2:y=34;break;}.

case x of 1:y=45;break; 2:y:=34; end; .
W=["switch","(","x",")","{","case","1",":","y","=","4 5",";","break",";","case","2",":","y","=","34",";" ,"break",";","}","."], MW=["case ","x"," of ","1",":","y","=","45",";","break",";"," ","2",":","y",":","=","34",";"," "," end; ","."]
4 Solutions
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.06.2012, 08:02
Помогаю со студенческими работами здесь

Работа со списками
Здравствуйте! Выполняю лабораторную по Lisp'у. Задание следующее: Добавлено через 10 минут Дан...

Работа со списками.
Сформировать список строк L1, считав его из файла input.txt. Для каждой строки списка найти...

Работа со списками
Помогите пожалуйста!Днем сдавать зачет! Разработать программу формирования и вывода на печать...

Работа со списками
Всем привет, прошу помочь мне. Вот такая задача. Работа со списком. Мне нужно работать с двома...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru