МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ "ЛЬВІВСЬКА ПОЛІТЕХНІКА"
Інститут КНІТ
Кафедра ПЗ
ЗВІТ
До лабораторної роботи № 3
На тему: “ Проектування локальних та мережевих довідкових систем”
З дисципліни : "Системи штучного інтелекту"
Львів – 2010
Тема роботи: Проектування локальних та мережевих довідкових систем.
Мета роботи: Розробити довідкові системи трьох типів: інтегровану довідкову систему на основі семантичної мережі; довідкову систему на основі гіпертекстової моделі знань; довідкову систему на основі фреймової мережі.
Завдання
Вхідними даними є текстовий файл – каталог програмних засобів (ПЗ) для побудови експертних систем. Необхідно розробити довідкові системи трьох зазначених вище типів.
Вибір інформації повинен здійснюватись за двома формами:
скороченій - у вигляді списку назв ПЗ, вибраних за заданим критерієм;
повній - у вигляді опису конкретних ПЗ.
Код програми
using System;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace AI_lab3
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Dictionary<string, string> terms = new Dictionary<string, string>();
Dictionary<string, ArrayList> see_also = new Dictionary<string, ArrayList>();
private void Form1_Load(object sender, EventArgs e)
{
StreamReader sr = new StreamReader("..\\..\\source.txt", Encoding.GetEncoding(1251));
string s = "";
while ((s = sr.ReadLine()) != null)
{
if (s == "") continue;
if (s[0] == '@')
treeView1.Nodes.Add(s.Remove(0, 1));
else
{
treeView1.Nodes[treeView1.Nodes.Count - 1].Nodes.Add(s.Split(' ')[0]);
terms.Add(s.Split(' ')[0], s);
}
}
ArrayList al;
foreach (string value in terms.Values)
{
al = new ArrayList();
foreach (string str in value.Split(new char[] { ' ', '.', ',', ';', ':' }))
{
if (terms.ContainsKey(str) == true && al.Contains(str) == false &&
str != value.Split(' ')[0])
al.Add(str);
}
see_also.Add(value.Split(' ')[0], al);
}
}
ArrayList ll_array = new ArrayList();
ArrayList visited_nodes = new ArrayList();
int cur_pos = 0;
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
textBox1.Select(0, 5);
textBox1.DeselectAll();
if (terms.ContainsKey(e.Node.Text))
{
textBox1.Text = terms[e.Node.Text];
textBox1.SelectAll();
textBox1.SelectionFont = new Font("Microsoft Sans Serif", 9F, FontStyle.Regular, GraphicsUnit.Point, ((byte)(204)));
textBox1.Select(0, e.Node.Text.Length);
textBox1.SelectionFont = new Font("Microsoft Sans Serif", 9F, FontStyle.Italic | FontStyle.Bold | FontStyle.Underline, GraphicsUnit.Point, ((byte)(204)));
string s = textBox1.Text.Remove(0, e.Node.Text.Length);
int count = 1;
while (s.IndexOf(e.Node.Text) >= 0)
{
textBox1.Select(s.IndexOf(e.Node.Text) + e.Node.Text.Length * count, e.Node.Text.Length);
textBox1.SelectionFont = new Font("Microsoft Sans Serif", 9F, FontStyle.Bold, GraphicsUnit.Point, ((byte)(204)));
s = s.Remove(s.IndexOf(e.Node.Text), e.Node.Text.Length);
count++;
}
LinkLabel ll, ll2;
foreach (LinkLabel link_lab in ll_array)
{
link_lab.Dispose();
}
ll_array.Clear();
foreach (string str in see_also[e.Node.Text])
{
string s1 = textBox1.Text;
int count1 = 0;
while (s1.IndexOf(str) >= 0)
{
textBox1.Select(s1.IndexOf(str) + str.Length * count1, str.Length);
textBox1.SelectionFont = new Font("Microsoft Sans Serif", 9F, FontStyle.Italic | FontStyle.Underline, GraphicsUnit.Point, ((byte)(204)));
s1 = s1.Remove(s1.IndexOf(str), str.Length);
count1++;
}
ll = new LinkLabel();
ll.Parent = this.panel1;
ll.AutoSize = true;
ll.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
ll.Text = str;
ll.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(ll_Clicked);
if (ll_array.Count == 0)
ll.Location = new System.Drawing.Point(4, 235);
else
{
ll2 = (LinkLabel)ll_array[ll_array.Count - 1];
ll.Location = new System.Drawing.Point(ll2.Left + ll2.Width + 5, 235);
}
ll_array.Add(ll);
}
if (ll_array.Count == 0)
{
label1.Visible = false;
textBox1.Height = 256;
}
else
{
label1.Visible = true;
textBox1.Height = 202;
}
if (sender.GetType().Name != "Button")
{
for (int i = cur_pos; i < visited_nodes.Count; i++)
visited_nodes.RemoveAt(i);
visited_nodes.Add(e.Node);
cur_pos = visited_nodes.Count;
button2.Enabled = false;
if (visited_nodes.Count > 1)
button1.Enabled = true;
}
textBox1.Select(0, 5);
textBox1.DeselectAll();
}
}
private void ll_Clicked(object sender, LinkLabelLinkClickedEventArgs e)
{
LinkLabel ll = (LinkLabel)sender;
foreach (TreeNode node in treeView1.Nodes)
{
foreach (TreeNode node2 in node.Nodes)
{
if (node2.Text == ll.Text)
{
node.Expand();
node2.Checked = true;
treeView1_NodeMouseClick(node2,
new TreeNodeMouseClickEventArgs(node2, MouseButtons.Left, 1, 1, 1));
}
}
}
}
private void button1_Click(object sender, EventArgs e)
{
button2.Enabled = true;
cur_pos--;
if (cur_pos == 1)
button1.Enabled = false;
treeView1_NodeMouseClick(sender,
new TreeNodeMouseClickEventArgs((TreeNode)visited_nodes[cur_pos-1], MouseButtons.Left, 1, 1, 1));
}
private void button2_Click(object sender, EventArgs e)
{
button1.Enabled = true;
cur_pos++;
if (cur_pos == visited_nodes.Count)
button2.Enabled = false;
treeView1_NodeMouseClick(sender,
new TreeNodeMouseClickEventArgs((TreeNode)visited_nodes[cur_pos - 1], MouseButtons.Left, 1, 1, 1));
}
////////////////////////////////////////////////////////////////////////////////
ArrayList frame_terms = new ArrayList();
private void button14_Click(object sender, EventArgs e)
{
panel2.Visible = true;
panel2.BringToFront();
panel4.Visible = false;
panel5.Visible = false;
panel6.Visible = false;
bool OK = false;
RadioButton rb_checked = new RadioButton();
foreach (RadioButton rb in groupBox1.Controls)
{
if (rb.Checked == true)
{
OK = true;
rb_checked = rb;
}
}
if (OK == false)
{
MessageBox.Show(this, "Виберіть один із пунктів", "Помилка");
return;
}
int index = 0;
foreach (TreeNode node in treeView1.Nodes)
{
if (node.Text == rb_checked.Text)
index = node.Index;
}
foreach (TreeNode node in treeView1.Nodes[index].Nodes)
{
frame_terms.Add(node.Text);
}
panel4.Visible = true;
panel4.BringToFront();
panel2.Visible = false;
panel5.Visible = false;
panel6.Visible = false;
}
private void button12_Click(object sender, EventArgs e)
{
panel2.Visible = true;
panel2.BringToFront();
panel4.Visible = false;
panel5.Visible = false;
panel6.Visible = false;
foreach (RadioButton rb in groupBox1.Controls)
{
rb.Checked = false;
}
foreach (RadioButton rb in groupBox3.Controls)
{
rb.Checked = false;
}
foreach (RadioButton rb in groupBox4.Controls)
{
rb.Checked = false;
}
frame_terms.Clear();
listBox1.Items.Clear();
textBox2.Text = "";
}
private void button3_Click(object sender, EventArgs e)
{
bool OK = false;
RadioButton rb_checked = new RadioButton();
foreach (RadioButton rb in groupBox3.Controls)
{
if (rb.Checked == true)
{
OK = true;
rb_checked = rb;
}
}
if (OK == false)
{
MessageBox.Show(this, "Виберіть один із пунктів", "Помилка");
return;
}
ArrayList[] letters = new ArrayList[5]{
new ArrayList{'A', 'B', 'C', 'D', 'E'},
new ArrayList{'F', 'G', 'H', 'I', 'J'},
new ArrayList{'K', 'L', 'M', 'N', 'O'},
new ArrayList{'P', 'Q', 'R', 'S', 'T'},
new ArrayList{'U', 'V', 'W', 'X', 'Y', 'Z'}};
ArrayList tmp = new ArrayList();
foreach (string term in frame_terms)
{
int ind = int.Parse(rb_checked.Tag.ToString());
if (letters[ind].Contains(term[0]) == true)
tmp.Add(term);
}
frame_terms = tmp;
panel5.Visible = true;
panel5.BringToFront();
panel2.Visible = false;
panel4.Visible = false;
panel6.Visible = false;
}
private void button10_Click(object sender, EventArgs e)
{
button14_Click(sender, e);
foreach (RadioButton rb in groupBox3.Controls)
{
rb.Checked = false;
}
foreach (RadioButton rb in groupBox4.Controls)
{
rb.Checked = false;
}
}
private void button11_Click(object sender, EventArgs e)
{
bool OK = false;
RadioButton rb_checked = new RadioButton();
foreach (RadioButton rb in groupBox4.Controls)
{
if (rb.Checked == true)
{
OK = true;
rb_checked = rb;
}
}
if (OK == false)
{
MessageBox.Show(this, "Виберіть один із пунктів", "Помилка");
return;
}
int lower, upper;
if (radioButton22.Checked == true)
{
lower = 1;
upper = 3;
}
else if (radioButton21.Checked == true)
{
lower = 4;
upper = 6;
}
else if (radioButton20.Checked == true)
{
lower = 7;
upper = 10;
}
else
{
lower = 11;
upper = 100;
}
ArrayList tmp = new ArrayList();
foreach (string term in frame_terms)
{
if (term.Length >= lower && term.Length <= upper)
tmp.Add(term);
}
frame_terms = tmp;
panel6.Visible = true;
panel6.BringToFront();
panel2.Visible = false;
panel5.Visible = false;
panel4.Visible = false;
foreach (string term in frame_terms)
{
listBox1.Items.Add(term);
}
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
textBox2.Text = terms[listBox1.SelectedItem.ToString()];
}
}
}
Протокол роботи
При роботі з довідковою системою на основі семантичної мережі в правій частині вікна можна вибрати категорію та необхідну назву програмного забезпечення, опис якого необхідно отримати. В результаті в правій частині вікна буде відображено повний опис вибраного програмного забезпечення. У разі, якщо в описі містяться назви іншого ПЗ, що входять до складу даної довідкової системи, то під описом в розділі „Див. також” будуть відображені посилання на ПЗ, що зазначене в описі.
Кнопки „Назад” і „Вперед” використовуються для переходу між описами ПЗ, що переглядалось. Так, наприклад, перейшовши за посиланням „INTERLISP”, можна повернутись назад до перегляду інформації про „SMALLTALK”, натиснувши кнопку „Назад”.
Перейшовши на вкладку „ДС на основі фреймової мережі”, користувач для пошуку потрібного йому ПЗ має дати відповіді на 3 питання. В результаті йому буде видано список з назвами ПЗ, що підходять під задані користувачем характеристики.
Як видно, заданим вище характеристикам відповідає три програмних засоби. Після вибору одного з них, користувачу буде надано повний його опис.
Висновок
На цій лабораторній роботі я розробив довідкові системи трьох типів: інтегровану довідкову систему на основі семантичної мережі; довідкову систему на основі гіпертекстової моделі знань; довідкову систему на основі фреймової мережі. При цьому для довідкової системи на основі семантичної мережі використовується деревовидне представлення з можливістю розкриття змісту вузлів і відображенням інформації у повному і скороченому вигляді; довідкова система на основі фреймової мережі підтримує запити на основі анкети і функцію рестарту на початок мережі. У довідковій системі на основі семантичної мережі використовується також можливість переходу між описами певних програмних засобів за гіперпосиланнями.