МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
Чорноморський державний університет імені Петра Могили
Факультет комп’ютерних наук
Кафедра інтелектуальних інформаційних систем
ЗВІТ
з лабораторної роботи №3
“Нормальний алгоритм Маркова”
Дисципліна “Теорія алгоритмів та математична логіка”
Спеціальність “Інтелектуальні системи прийняття рішень”
6.050101–ЛР.ПЗ.03–303.2910302
Студент___________К.О.Баранов
(підпис)
____________
(дата)
Викладач___________Д.О.Назаренко
(підпис)
____________
(дата)
Миколаїв – 2012
Варіант 1
Реалізувати нормальний алгоритм Маркова відповідно до варіанту, наведеного у таблиці 1.
№ варiанту |
A |
B |
C |
D |
1 |
a b c d |
ab→c bd→/\ cd→a ac→/\ |
aacbbadcd |
dcabbaaddc |
Реалізація алгоритму Маркова за допомогою Інтерпретатора Алгоритмів Маркова:
Для С:
Для D:
Алгоритм:
-
У впорядкованій послідовності підстановок шукається найперша підстановка, ліве слово якої входить в рядок даних.
-
В рядку даних шукається найперше (лівіше) входження лівого слова знайденої підстановки.
-
Це входження в рядку даних замінюється на праве слово знайденої підстановки (перетворення даних).
-
Кроки 1-3 повторюються до тих пір не виникне ситуація, коли крок не може бути виконаний через те, що жодна із підстановок не підходить
Лістинг програми:
public class Main {
static int nLevel = 0;
public String Rules(String inStr, int inRule, String[] rs) {
String newStr = inStr.substring(0, inRule);
newStr += rs[1];
newStr += inStr.substring(inRule + rs[0].length());
return newStr;
}
public void Marcov(String inStr, String[][] rs, int l) {
nLevel++;
String inputStr = inStr;
String[][] rules = rs;
int level = l;
++level;
String newStr;
int count =0;
for (int i = 0; i < rules.length; i++) {
int inRule;
inRule = inputStr.indexOf(rules[i][0]);
if (inRule != -1) {
for(int j=0; j<nLevel; j++){
System.out.print(" ");
}
newStr = Rules(inputStr, inRule, rules[i]);
count++;
System.out.println("Рівень = " + level + ", " + inputStr + " -> " + rules[i][0] + " замінюємо " + rules[i][1] + " -> " + newStr);
Marcov(newStr, rules, level);
}
}
nLevel--;
}
public static void main(String[] args) {
DataFromFile dff = new DataFromFile();
Main m = new Main();
dff.readFile();
System.out.println("Правила: ");
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 2; j++) {
System.out.print(dff.finalRules[i][j]+" ");
}
System.out.println();
}
for (int k=0;k<2;k++) {
System.out.println("Рядок на вході:\n" + dff.finalStrings[k]);
System.out.println("Нормальний алгоритм Маркова:");
m.Marcov(dff.finalStrings[k], dff.finalRules, 0);
}
}
}
public class DataFromFile {
static String[][] finalRules = new String[4][];
static String[] finalStrings = new String[2];
public void readFile() {
try {
LineNumberReader str_in = new LineNumberReader(new BufferedReader(new FileReader("inputStr.txt")));
LineNumberReader rules_in = new LineNumberReader(new BufferedReader(new FileReader("inputRules.txt")));
String[] rules = new String[4];
for (int i=0;i<rules.length;i++){
finalRules[i] = new String[2];
}
for (int i = 0; i < 2; i++) {
finalStrings[i] = str_in.readLine();
}
for (int i = 0; i < 4; i++) {
rules[i] = rules_in.readLine();
}
for (int i=0;i<4;i++){
finalRules[i][0]= rules[i].substring(0, rules[i].indexOf("-"));
finalRules[i][1] = rules[i].substring(rules[i].indexOf("-") + 1, rules[i].length());
}
finalRules[3][1] = "";
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 2; j++) {
if (finalRules[i][j] == " ") {
finalRules[i][j] = "";
}
}
}
} catch (IOException ex) {
System.out.println("Error. File not found.");
}
}
}
Результат: