Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.12.2017, 21:55   #1
alexboliam
Пользователь
 
Регистрация: 10.10.2017
Сообщений: 44
По умолчанию Дополнить интерпретатор Brainfuck на Visual Prolog 5.2

Доброго времени суток. Надо дополнить этот код так, чтобы интерпретатор по считыванию файла выдавал значение формулы x^3 + 2x^2 + 5 . Как я понял, её надо задать на брейнфаке в отдельном текстовом файле (в коде - code.txt). Прошу помочь с самим файлом code.txt Спасибо заранее за советы!
Код:
domains
addr = integer
data = integer
file = codefile %*переменная* с прочитанным файлом - codefile
loop_addr_value = integer*
loops = loop_addr_value*
 
database
data(addr, data). %ячейки данных
pos(addr).  %указатель на ячейку
circle(loops). %[[указатель на позицию начала цикла, значение цикла], ..]
code_pos(integer). %позиция в читаемом файле
 
predicates
cin.        % . .  
cout.       % , , 
add(integer).   % + - 
addr(integer).  % > < 
loop.       % [ [  
goto.       % ] ] 
 
get(data). %получение инфы с ячейки
set(data). %сохранение инфы в ячейку
readcode(string). %код, начиная с указателя
new_code_pos(integer). %сохранить указатель на код
 
do().   
cmd(string).    
 
clauses
 
readcode(D):- code_pos(A), readdevice(codefile), filepos(codefile, A, 0), readln(D). %риддевайс переключаем на файл!!
new_code_pos(Pos):-retract(code_pos(_)), assert(code_pos(Pos)).
 
get(D):- pos(A), data(A,D), !.
get(0). %если ячейка пустая возвращаем 0
 
set(D):- pos(A), retract(data(A,_)), assert(data(A,D)), !. 
set(D):- pos(A), assert(data(A,D)), !. 
 
 
cout:- get(D), char_int(ASCII, D), str_char(ASCII_S, ASCII), write("Out: ", D, "(",ASCII_S,")\n"). 
cin:-  write("In: "), readdevice(keyboard), readint(D),  set(D). %риддевайс на клаву!
add(AddValue):-  get(OldData), NewData = OldData + AddValue, set(NewData).
addr(AddValue):-  pos(OldAddr), retract(pos(_)),  NewAddr = OldAddr+AddValue,  assert(pos(NewAddr)). 
 
loop:- retract(circle(L)), !, get(D), code_pos(Pos), assert(circle([[Pos,D]|L])). %меняем инфу в бд, добавляя текущую позицию в "стек" вызовов
 
goto:- get(D), D=0, retract(circle([_|L])), assert(circle(L)). %удаляем из "стека" последнюю [
goto:- circle([[A,_]|_]), new_code_pos(A). %если текущая ячейка != 0 то возвращаемся на [
 
%читаем код с сохраненной в бд позиции, обрабатываем слово из 4х букв, меняем в бд позицию, *рекурсия*
do():-  readcode(In), frontstr(4, In, Cmd, _), code_pos(Pos), NewPos = Pos+4, new_code_pos(NewPos), cmd(Cmd), !, do. 
 
cmd("["):- loop,!. 
cmd("]"):- goto, !. 
cmd( _ ):-circle([[_,StartValue]|_]),StartValue=0,!. %не выполняем команды снизу если начат цикл [ и ячейка == 0
cmd(">"):- addr( 1),!. 
cmd("<"):- addr(-1),!. 
cmd(","):- cin,!. 
cmd("."):- cout,!. 
cmd("+"):- add(1),!. 
cmd("-"):- add(-1),!. 
cmd(_). 
 
%достаем файл из *lab_folder*\Obj\code.txt, инициализируем значения в бд и начинаем выполнение!
goal openread(codefile, "code.txt"), assert(pos(1)), assert(code_pos(0)), assert(circle([])), 
write("count x^3 + 2x^2 + 5, enter x now\n"), do, !.
P.S. Количество букв в коде будет наверное не 4, как и позиций, до этого в коде был пример x^3 + 7

Последний раз редактировалось alexboliam; 04.12.2017 в 21:59.
alexboliam вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SWI prolog и Visual prolog поиск маршрута Екатерина 123 Помощь студентам 0 27.08.2015 19:42
Visual Prolog kikisa Помощь студентам 0 11.06.2012 17:36
интерпретатор Brainfuck на winapi Alex_under Win Api 0 02.05.2011 16:42
Интерпретатор Brainfuck Alex_under Общие вопросы C/C++ 6 01.05.2011 17:28
Дополнить программу в Turbo Prolog Paco de lucia Помощь студентам 0 08.03.2010 19:59