2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Prolog-«Файлы»
Сообщение01.05.2013, 22:35 


01/05/13
3
Помогите пожалуйста к зачету решить последняя лаба

2)Создайте предикат, осуществляющий переписывание из одного файла, содержащего числа, в другой файл только тех чисел, которые являются четными.

Как можно под мою задачу переделать?

Переписать числа из файла в другой, дописав за каждым его квадрат.

код: [ скачать ] [ спрятать ]
Используется синтаксис Prolog
  1. domains
  2. strElement=string
  3. strList=strElement*
  4. intElement=integer
  5. intList=intElement*
  6. predicates
  7. /************************преобразовани е в список*/
  8. separ(string,strlist)
  9. scan (string,strlist,string)
  10. /************************************************/
  11. /******преобразование списка слов в список чисел*/
  12. convertStrListToIntList(strList,intList)
  13. csltil(intList,intList,strElement)
  14. /************************************************/
  15. /*******************дополнение списка квадратами*/
  16. p( intList, intList )
  17. /************************************************/
  18.  
  19. clauses
  20. /************************преобразовани е в список*/
  21. separ(Str,[T|L]):-
  22. frontchar(Str,S3,S2),
  23. str_char(S5,S3),
  24. scan(S2,[T|L],S5),!.
  25. separ(_,[]).
  26. scan(Str,[T|L],S):-
  27. frontchar(Str,S3,S2),
  28. NOT(S3=' '),
  29. str_char(S5,S3),
  30. concat(S,S5,S1),
  31. scan(S2,[T|L],S1),!.
  32. scan("",[T|L],S):-
  33. T=S,separ("",L).
  34. scan(Str,[T|L],S):-
  35. T=S,frontchar(Str,_,S2),
  36. separ(S2,L),!.
  37. /************************************************/
  38. /******преобразование списка слов в список чисел*/
  39. convertStrListToIntList([],[]):-!.
  40. convertStrListToIntList([HS|TS],LI):-
  41. convertStrListToIntList(TS,TI),
  42. csltil(TI,LI,HS).
  43. csltil(TL,[HI|TL],HS):-
  44. str_int(HS,HI),!.
  45. csltil(TL,TL,_):-!.
  46. /************************************************/
  47. /*******************дополнение списка квадратами*/
  48. p( [], [] ).
  49. p( [H|T], [H|[HH|TT]] ):-
  50. HH = H*H, p(T,TT).
  51. /************************************************/
  52.  
  53. goal
  54. %S="1 2 3 4 12 asd 24 12",
  55. file_str("input.txt",S),
  56. separ(S,LS),
  57. convertStrListToIntList(LS,IL),
  58. write(IL),nl,
  59. p(IL,RL), write(RL),nl.
  60.  

 Профиль  
                  
 
 Re: Prolog-«Файлы»
Сообщение01.05.2013, 22:54 
Заслуженный участник


27/04/09
28128
Для начала выделите в этом коде такой минимальный по размеру кусок кода, заменой которого можно сделать программу такой, какая вам нужна.

-- Чт май 02, 2013 01:54:45 --

Потом мы его вместе переделаем, и будет весело.

 Профиль  
                  
 
 Re: Prolog-«Файлы»
Сообщение02.05.2013, 01:39 
Админ форума
Аватара пользователя


19/03/10
8952
 !  igrokk, при размещении программного кода на форуме следует заключать его в тег [syntаx] или [cоde]. Заключил.

 Профиль  
                  
 
 Re: Prolog-«Файлы»
Сообщение02.05.2013, 09:39 


01/05/13
3
2)Создайте предикат, осуществляющий переписывание из одного файла, содержащего числа, в другой файл только тех чисел, которые являются четными.

Как можно под мою задачу переделать?

[syntax lang="prolog" lines="n"]
domains
strElement=string
strList=strElement*
intElement=integer
intList=intElement*
predicates
/************************преобразовани е в список*/
separ(string,strlist)
scan (string,strlist,string)
/************************************************/
/******преобразование списка слов в список чисел*/
convertStrListToIntList(strList,intList)
csltil(intList,intList,strElement)
/************************************************/
/*******************дополнение списка квадратами*/
p( intList, intList )

/************************************************/

clauses
/************************преобразовани е в список*/
separ(Str,[T|L]):-
frontchar(Str,S3,S2),
str_char(S5,S3),
scan(S2,[T|L],S5),!.
separ(_,[]).
scan(Str,[T|L],S):-
frontchar(Str,S3,S2),
NOT(S3=' '),
str_char(S5,S3),
concat(S,S5,S1),
scan(S2,[T|L],S1),!.
scan("",[T|L],S):-
T=S,separ("",L).
scan(Str,[T|L],S):-
T=S,frontchar(Str,_,S2),
separ(S2,L),!.
/************************************************/
/******преобразование списка слов в список чисел*/
convertStrListToIntList([],[]):-!.
convertStrListToIntList([HS|TS],LI):-
convertStrListToIntList(TS,TI),
csltil(TI,LI,HS).
csltil(TL,[HI|TL],HS):-
str_int(HS,HI),!.
csltil(TL,TL,_):-!.
/************************************************/
/*******************дополнение списка квадратами*/
p( [], [] ).
p( [H|T], [H|[HH|TT]] ):-
HH = H*H, p(T,TT).

/************************************************/

goal
%S="1 2 3 4 12 asd 24 12",
file_str("input.txt",S),
separ(S,LS),
convertStrListToIntList(LS,IL),
write(IL),nl,
p(IL,RL), write(RL),nl.
[/syntax][/quote]
Я думал если выделенное заменить на запись только четных. Сложное задание слишком(

 Профиль  
                  
 
 Re: Prolog-«Файлы»
Сообщение02.05.2013, 18:33 
Заслуженный участник


27/04/09
28128
Да, то самое выделение.

Давайте теперь писать свой p. Только вот я не знаю, есть ли в Прологе или конкретно в используемой версии предикат, определяющий чётность целого числа. Даже если нет, пока предположим, что он есть и называется isEven, принимает один аргумент — число, и успешно выполняется для чётных.

Теперь, имея определитель чётного числа (если стандартного предиката такого нет, мы его напишем после), попробуйте написать p.

 Профиль  
                  
 
 Re: Prolog-«Файлы»
Сообщение02.05.2013, 21:55 


01/05/13
3
Вот теория по этой лабе которую нам в институте дали:

Теоретическая часть

1. Предикаты вывода.

В Прологе имеются три стандартных предиката для вывода: write, nl, writef. Предикат write(P1, P2,...Pn) имеет произвольное число аргументов P1,P2..Pn. Эти аргументы могут быть либо константами, либо связанными переменными. Предикат nl (new line - новая строка) обеспечивает переход на новую строку на экране. Внутри строки вместо nl записывается \n. Предикат writef позволяет выполнить форматированный вывод.

Пример. Следующие подцели:

pupil (Name, Class), write (Name," успешно перешёл в ",Class," класс."), nl,
write ("-------------------------------").
могут привести к выводу на экран такого результата:
Орлов успешно перешел в 7 класс.
-------------------------------------------
Пример.

% "Распечатка списка без квадратных скобок.
domains
intlist = integer*
namilist = symbol*
predicates
writelist (intlist)
writelist (nameilist)
clauses
writelist ([ ]).
Writelist ([ H | T ]) :- write (H," "), writelist (T).

Цель для вывода списка целых чисел: goal writelist ( [1,2,3,4] ).
Поработайте с этой программой и выведите на экран список целых чисел и список фамилий. Обратите внимание на использование в программе рекурсии.

В предикате форматированного вывода
Writef (FormatString,P1,P2,...,Pn) (i,i,...i)
строка форматирования FormatString содержит обычные символы и форматные спецификаторы. Форматные спецификаторы имеют форму
%-m.pq. Символы спецификаторов формата, следующие за знаком процента, являются необязательными и имеют следующее значение:
дефис (-) показывает, что поле выравнивается слева (по умолчанию выравнивается справа);
m - десятичное число, определяющее минимальную длину поля;
p - десятичное число, описывающее точность представления с плавающей точкой, либо максимальное число символов, печатаемых в строке;
q - описывает форматы, отличные от форматов, принятых по умолчанию для данного объекта.
Значения q:
f -вещественные с фиксированной точкой (пример: 123.4),
e -вещественные в экспоненциальной форме (пример: 1.234e2),
g -вещественные в формате f или e (формат по умолчанию),
d -символьные или целые как десятичные числа,
u -символьные или целые как беззнаковые целые,
x -символьные или целые как шестнадцатиричные числа,
c -символьные или целые как символы,
X -длинное шестнадцатеричное число,
s -строки (symbol и string).
Поработайте с программой “Демонстрация предиката writef”.
% :Демонстрация предиката writef.
goal
A = 330.12, B = 4.3333375,
writef ("A = % 8.4e ", A), nl, writef("B = %-7.4”, B).

Результаты вывода:
A = 3.3012E+02
B = 4.3333.
Предикаты ввода

Пролог имеет пять стандартных предикатов ввода: readln, readint, readreal, readchar (для чтения строк символов, целых, вещественных и символьных значений) и readterm (для чтения составных объектов). Все эти предикаты могут быть переопределены для чтения из файлов. Имеются и другие предикаты, относящиеся к категории чтения:
Буквы “o” и “i” после предикатов обозначают выходные и входные значения переменных в рассматриваемых ниже предикатах.

readln (Line) - (o).
Читает текстовую строку до 127 символов. Домен для переменной Line должен быть строкового либо символьного типа. Переменная Line должна быть свободна. Буква (о) означает, что переменная в скобках - выходная величина.
=======================================================
readint (X) - (o)
Считывает целое значение. Домен для переменной X должен быть целого типа, а X перед вызовом должна быть свободна.
=======================================================
readreal (X) - (o), readchar (CharParam) - (o)
Предикат readreal cчитывает вещественные числа аналогично readint, считывающему целые. Предикат readchar считывает один символ с текущего устройства ввода.
=======================================================
file_str (Filename,Text) - (i,o), (i,i)
Читает символы из файла и переносит их в переменную или создает файл и записывает в этот файл строку. Если перед вызовом file_str переменная Text свободна, file_str читает символы из файла Filename, пока не встретится символ конца файла. Содержимое файла Filename пересылается в переменную Text. Например, вызов file_str("t.dat", Myext) свяжет Myext с содержимым файла t.dat. Читаемый файл не может превышать 64 Кбайт.
=======================================================
inkey (Char) - (o)
Читает символ с клавиатуры. Если, когда вызывается inkey, клавиша нажата или символ содержится в буфере клавиатуры, то inkey возвратит аргумент, которому присвоено значение символа.
========================================================
keypressed
Проверяет, была ли нажата клавиша на клавиатуре. Предикат keypressed завершается успешно, если клавиша нажата или символ присутствует в буфере клавиатуры.

Разберите и выполните программу чтения в список целых чисел. Эта программа демонстрирует использование предиката readint. Она читает одно целое число на строке, пока вы не введете не целое ( не нажмете клавишу Х ). После этого список будет выведен на экран. Преобразуйте эту программу для чтения в список фамилий писателей.

% Чтение целых чисел и преобразования их в список.
domains list = integer*
predicates
readlist (list)
goal
makewindow (1,7,7,"Список целых чисел",5,5,15,70),
write ("Введите в список целое число: "), nl,
write ("Нажмите клавишу Х для окончания ввода."),
readlist (TheList), write( "\nСписок : ", TheList).
clauses
readlist ( [H|T ]) :- write("\16"), %Печать символа-приглашения.
readint (H), !, readlist (T). readlist ([ ]).

Файловая система Пролога
Рассмотрим файловую систему Пролога и стандартные предикаты для работы с файлами. Обычно текущим устройством чтения является клавиатура, а текущим устройством записи - экран дисплея. Однако вы можете назначить другие устройства. Например, ввод может осуществляться из файла, а вывод посылаться на устройство печати.
Для доступа к файлу сначала нужно открыть его. Файл может быть открыт для чтения, для записи, для добавления, для модификации. Файл, открытый для любого действия, отличного от чтения, должен быть закрыт, когда этот вид операций завершается. В противном случае внесенные в файл изменения могут быть потеряны. Можно открыть несколько файлов одновременно.
Когда Пролог открывает файл, он связывает символическое имя с действительным именем файла операционной системы ДОС. Символическое имя используется для направления ввода и вывода. Символические имена файлов должны начинаться с маленькой буквы и должны быть объявлены в описании домена file.

Например: file = file1; source; auxiliary

Пролог распознает семь зарезервированных символических имен файлов. Открывать и закрывать их не требуется.

com1 -запись в стандартный коммуникационный порт;
keyboard - чтение с клавиатуры (по умолчанию);
printer - запись в параллельный порт устройства печати;
screen - запись в экранный монитор (по умолчанию);
stdin - чтение из стандартного ввода ДОС;
stdout - запись в стандартный вывод ДОС;
stderr - запись на стандартное устройство для вывода ошибок ДОС.

Предикаты открытия и закрытия файлов
Разберите и выполните программу записи текста с клавиатуры в файл. Программа помещает символы, набираемые с клавиатуры, в файл tryfile.one пока не будет введен знак ‘#’. Набираемые символы на экран дисплея не выводятся.

% Запись текста с клавиатуры в файл.
domains file = myfile
predicates
readloop
goal openwrite(myfile,"tryfile.one"), writedevice(myfille), readloop, losefile (myfile).
clauses
readloop :- readchar (X), X<>' # ', !, write (X), readloop. readloop.

filepos(SymbolicFileName, FilePosition, Mode) - (i, i, i),(i, o, i)
==================================================
Может управлять позицией, где производится чтение или запись. Если FilePosition - связанная переменная, предикат может изменить позицию чтения и записи для файла. Если при вызове FilePosition является свободной переменной, то SymbolicFileName возвращает текущую позицию в файле. FilePosition дожна иметь вещественное значение (любая дробная часть игнорируется). Mode является целым числом и указывает, как должно интерпретироваться значение FilePosition:

Mode FilePosition
---- -----------------------------------------------------------------
0 Относительно начала файла.
1 Относительно текущей позиции.
2 Относительно конца файла.
(Конец файла соответствует позиции 0.)

Когда возвращается FilePosition, filepos возвращает позицию относительно начала файла. Замечание: При использовании filepos новая строка в файле считается как два символа.
Создайте текстовый файл. Разберите и выполните следующую программу:

% Чтение выбранных позиций в файле. Файл prog9_5.pro.
% Программа запрашивает имя файла, затем показывает содержимое
% позиций файла, причем номера позиций вводятся с клавиатуры.

domains file = input
predicates
inspect_positions
goal
write("Введите имя файла : "), readln (FileName),
openread (input, FileName), inspect_positions.
clauses
inspect_position :- readdevice(keyboard), nl,
write ("Номер позиции : "), readreal (X), readdevice (input),
filepos (input,X,0), readchar (Y), write ("Символ: ",Y), inspect_positions.
======================================================

Создайте файл с предикатами. Разберите следующую программу и поработайте с ней.
% Чтение данных из файла.
domains
nam,addr = string
one_data_record = p(name,addr)
file = file_of_data_records
predicates
person (name, addr)
moredata(file)
clauses
person (Name, Addr) :-
openread (file_of_data_records,"dd.dat"),
readdevice (file_of_data_records),
moredata (file_of_data_records),
readterm (one_data_record, p(Name,Addr)).
moredata (_).
moredata (File):- not(eof (File)), moredata (File).

Если файл dd.dat содержит факты: р("Петр","Невский34-28"), р("Олег","Литейный 45-30"), то после выполнения программы может протекать диалог goal: p (“Петр”, Adress).
Address = Невский 34-28
1 Solution

С фактами, которые описываются предикатами базы данных, можно работать благодаря домену dbasedom (который автоматически объявляется Прологом) или любому, определенному пользователем, имени домена базы данных.

-- 02.05.2013, 22:58 --

Помогите народ( весь интернет перерыл подобного не нашел чтобы под мою похоже было

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group