Tải bản đầy đủ (.doc) (28 trang)

ĐỀ TÀI: CÁC BÀI TẬP THỰC HÀNH

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (257.19 KB, 28 trang )

Trờng Đại học S phạm kỹ thuật Hng Yên
Khoa Công nghệ thông tin

tiểu luận trí tuệ nhân tạo
Đề tài:
các bài tập thực hành
Giảng viên hớng dẫn : Hoàng Trọng Thế
Sinh viên thực hiện :
Lớp : TK6LC1
Hng yên 11-2009
Bài tập Tuần 1 3
Tuần 1:
GIẢI QUYẾT BÀI TOÁN BẰNG TÌM KIẾM
1.1. Tìm kiếm tốt nhất đầu tiên BFS.
1.1.1. Bài toán: Tìm kiếm.
1.1.2. Yêu cầu: Giải quyết bài toán tìm kiếm bằng thuật giải Tìm kiếm tốt nhất
đầu tiên BFS.
1.1.3. Mã nguồn chương trình:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace BFS
{
class Node
{
public int TenDinh;
public Node Link;
}
class Queue
{


public bool Empty(Node Sau)
{
return Sau == null;
}
public void Put(ref Node Sau,ref Node Truoc,int TenDinh1)
{
Console.WriteLine("Mot lan put");
Node q = new Node();
q.TenDinh = TenDinh1;
q.Link = null;
if (Empty(Sau))
{
Sau = Truoc = q;
}
else
{
Truoc.Link = q; Truoc = q;
}
}
public Node Pop(ref Node Sau)
{
Console.WriteLine("Mot lan pop");
Node Q = Sau;
Sau = Sau.Link;
return Q;
}
}
Tiểu luận Trí tuệ nhân tạo Sinh viên: - TK6LC1
Bài tập Tuần 1 4
class BFS : Queue

{
private bool[] KiemTra;//Kiem tra
private int[] HamDanhGia;
static string path = @"danhsachcanh.txt";
static string path1 = @"trongso.txt";
public int[] KetQua;//Ket qua duong di
private int i, j, d = 0, n, xp, kt;
private int[,] e;//Danh sach canh
public void Nhap()
{
int hang = -1, cot = 0;
StreamReader h = new StreamReader(path);
string str = h.ReadLine();
n = int.Parse(str);
KiemTra = new bool[n];
for (i = 0; i < n; i++) KiemTra[i] = false;
e = new int[n, n];
str = h.ReadLine();
while (str != null)
{
hang++;
cot = 0;
foreach (string tmp in str.Split(' '))
{
int x = int.Parse(tmp);
e[hang, cot] = x;
cot++;
}
str = h.ReadLine();
}

h.Close();
}
public void Hien()
{
Console.WriteLine("Hien ma tran canh");
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
Console.Write("{0} ", e[i, j]);
Console.WriteLine();
}
Console.WriteLine();
// Nhập đỉnh xuất phát và kết thúc
Console.Write("Nhap dinh xuat phat DinhXP=");
xp = int.Parse(Console.ReadLine());
Console.Write("Nhap dinh ket thuc DinhKT=");
kt = int.Parse(Console.ReadLine());
}
private bool Duyet_BFS()
{
bool TimThay = false;
// Khoi tao doi tuong queue
Queue A = new Queue();
//Khoi tao node Truoc va Sau
Node Truoc = new Node();
Tiểu luận Trí tuệ nhân tạo Sinh viên: - TK6LC1
Bài tập Tuần 1 5
Node Sau = new Node();
Truoc = Sau = null;
//Khoi tạo Node Tmp

Node Tmp = new Node();
//Cho đỉnh xuất phát vào queue
A.Put(ref Sau, ref Truoc, xp);
//Đưa trạng thái của đỉnh xp về trạng thái đã xét
KiemTra[xp] = true;
// Thực hiện vòng lặp
do
{
// Kiểm tra queue có rỗng hay không
if (A.Empty(Sau))
{
break;// Thoát khỏi chương trình
}
// Nếu không rỗng thì loại đỉnh ở cuối danh sách
Tmp = A.Pop(ref Sau);
Console.WriteLine("Lay ra đinh {0}", Tmp.TenDinh +
" Co đinh con");
//Cho đỉnh vào mảng kết quả đường đi
Array.Resize(ref KetQua, ++d);
KetQua[d - 1] = Tmp.TenDinh;
// Nếu đỉnh lấy ra trùng với đỉnh cần tìm thì kết
thúc thuật toán
if (Tmp.TenDinh == kt)
{
TimThay = true;
break;
}
// Nếu không tìm thấy thì xét các đỉnh con của
đỉnh vừa lấy ra
for (i = 0; i < n; i++)

{
if (e[Tmp.TenDinh,i] > 0 && KiemTra[i]==false)
{
// Nếu thoả mãn là đỉnh con và chưa đuợc
xét thì cho vào queue
A.Put(ref Sau, ref Truoc, i);
Console.WriteLine("Vao dinh {0} ", i);
// Gán trạng thái của đỉnh cho vào queue
về trạng thái đã xét
KiemTra[i] = true;
}
}
}
while (true);
return TimThay;
}
public void KetQua_BFS()
{
// Gọi phương thức duyệt đường đi
if (Duyet_BFS())
{
Console.WriteLine("Da tim thay ket qua");
// Viết ra đường đi
Tiểu luận Trí tuệ nhân tạo Sinh viên: - TK6LC1
Bài tập Tuần 1 6
for (i = 0; i < KetQua.Length; i++)
{
if (i < KetQua.Length - 1)
Console.Write("{0} ", KetQua[i] + "==>");
else Console.Write("{0} ", KetQua[i]);

}
Console.WriteLine();
}
else Console.WriteLine("Khong tim thay ket qua");
}
}
class Tester
{
static void Main()
{
BFS bfs = new BFS();
// Nhập dữ liệu từ tệp tin
bfs.Nhap();
// Hiện dữ liệu đã nhập
bfs.Hien();
// Gọi phương thức duyệt BFS_mở rộng
bfs.KetQua_BFS();
Console.ReadKey();
}
}
}
1.1.4. Kết quả thực nghiệm:
Dữ liệu vào: Đồ thị được cho dưới dạng ma trận kề trong tệp
danhsachcanh.txt
11
0 2 6 0 0 8 0 0 0 0 0
2 0 0 9 8 0 0 5 0 0 0
6 0 0 9 0 0 0 0 0 0 0
0 9 9 0 8 0 6 0 0 0 0
0 8 0 8 0 0 5 6 7 8 0

8 0 0 0 0 0 0 3 0 0 0
0 0 0 6 5 0 0 0 11 0 0
0 5 0 0 6 3 0 0 0 9 0
0 0 0 0 7 0 11 0 0 6 7
0 0 0 0 0 0 0 9 6 0 8
0 0 0 0 0 0 0 0 7 8 0
Tiểu luận Trí tuệ nhân tạo Sinh viên: - TK6LC1
Bài tập Tuần 1 7
Dữ liệu ra:
- Nhập đỉnh xuất phát ĐinhXP= 0
- Nhập đỉnh xuất phát ĐinhKT= 1
- Kết quả: 0 = =>1
1.2. Tìm kiếm leo đồi.
1.2.1. Bài toán: Tìm kiếm.
1.2.2. Yêu cầu: Giải quyết bài toán tìm kiếm bằng thuật giải Tìm kiếm leo đồi.
1.2.3. Mã nguồn chương trình:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
class Node
{
public int TenDinh;
public int TrongSo;
public Node Link;
public bool Empty(Node S)
{
return S == null;
}
public void Put(ref Node S, int TenDinh1, int TrongSo1)

{
Node q = new Node();
q.TenDinh = TenDinh1;
q.TrongSo = TrongSo1;
q.Link = null;
if (Empty(S))
{
S = q; S.Link = null;
}
else
{
q.Link = S; S = q;
}
}
public Node Pop(ref Node S)
{
Node Q = S;
S = S.Link;
return Q;
}
public void sort(Node S)
{
Node tmp, Q = S;
while (Q != null)
{
Tiểu luận Trí tuệ nhân tạo Sinh viên: - TK6LC1
Bài tập Tuần 1 8
tmp = Q.Link;
while (tmp != null)
{

if (Q.TrongSo < tmp.TrongSo)
{
int tmp1 = Q.TrongSo;
int tmp2 = Q.TenDinh;
Q.TenDinh = tmp.TenDinh;
Q.TrongSo = tmp.TrongSo;
tmp.TrongSo = tmp1;
tmp.TenDinh = tmp2;
}
tmp = tmp.Link;
}
Q = Q.Link;
}
}
}
class DFS_LeoDoi : Node
{
private bool[] KiemTra;//Kiem tra
private int[] HamDanhGia;
static string path = @"danhsachcanh.txt";
static string path1 = @"trongso.txt";
public int[] KetQua;//Ket qua duong di
private int i, j, d = 0, n, xp, kt;
private int[,] e;//Danh sach canh
public DFS_LeoDoi()
{
Console.WriteLine("Tim kiem leo doi");
}
public void Nhap()
{

int hang = -1, cot = 0;
StreamReader h = new StreamReader(path);
string str = h.ReadLine();
Console.WriteLine(str);
n = int.Parse(str);
KiemTra = new bool[n];
for (i = 0; i < n; i++) KiemTra[i] = true;
e = new int[n, n];
str = h.ReadLine();
while (str != null)
{
hang++;
cot = 0;
Console.WriteLine(str);
foreach (string tmp in str.Split(' '))
{
int x = int.Parse(tmp);
e[hang, cot] = x;
cot++;
}
str = h.ReadLine();
}
Tiểu luận Trí tuệ nhân tạo Sinh viên: - TK6LC1
Bài tập Tuần 1 9
h.Close();
// Khoi tao ma tran trong so
using (StreamReader dr = File.OpenText(path1))
{
string str1 = dr.ReadLine();
// So phan tu nay cung bang so dinh cua ma tran

int sophantu = int.Parse(str1);
HamDanhGia = new int[sophantu];
string[] tmp = new string[sophantu];
str1 = dr.ReadLine();
tmp = str1.Split(' ');
for (i = 0; i < tmp.Length; i++)
{
HamDanhGia[i] = int.Parse(tmp[i]);
}
}
}
public void Hien()
{
Console.WriteLine("Ma tran canh");
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
Console.Write("{0} ", e[i, j]);
Console.WriteLine();
}
Console.WriteLine("Ham danh gia");
for (i = 0; i < n; i++)
{
Console.Write("{0} ", HamDanhGia[i]);
}
Console.WriteLine();
// Nhập đỉnh xuất phát và kết thúc
Console.Write("Nhap dinh xuat phat DinhXP=");
xp = int.Parse(Console.ReadLine());
Console.Write("Nhap dinh ket thuc DinhKT=");

kt = int.Parse(Console.ReadLine());
}
private bool LeoDoi(int Deepth)
{
d = 0;
KetQua = null;
Node A = new Node();
Node L = new Node(); L = null;
Node B = new Node();
Node L1 = new Node(); L1 = null;
Node Tmp = new Node();
bool timthay = false;
A.Put(ref L, xp, HamDanhGia[xp]);
KiemTra[xp] = false;
do
{
if (A.Empty(L))
{
Console.WriteLine("Khong tim thay duong di");
break;
Tiểu luận Trí tuệ nhân tạo Sinh viên: - TK6LC1
Bài tập Tuần 1 10
}
Tmp = A.Pop(ref L);
Console.WriteLine("Dinh{0} co dinh con:",Tmp.TenDinh);
Array.Resize(ref KetQua, ++d);
KetQua[d - 1] = Tmp.TenDinh;
if (Tmp.TenDinh == kt)
{
Console.WriteLine("Ket qua da tim thay");

timthay = true;
break;
}
for (int k = n - 1; k >= 0; k )
{
if (e[Tmp.TenDinh, k] > 0 && KiemTra[k] == true)
{
Console.WriteLine("Dinh con {0} va do sau {1}", k,
HamDanhGia[k]);
B.Put(ref L1, k, HamDanhGia[k]);
KiemTra[k] = false;
}
}
B.sort(L1);
while (!B.Empty(L1))
{
Tmp = B.Pop(ref L1);
A.Put(ref L, Tmp.TenDinh, Tmp.TrongSo);
Console.WriteLine("Lan cho L1 vao L {0} va {1}",
Tmp.TenDinh, Tmp.TrongSo);
}
}
while (true);
return timthay;
// p
}
public void duyet()
{
if (LeoDoi(j))
{

Console.WriteLine("Da tim thay ket qua");
for (i = 0; i < KetQua.Length; i++)
{
if (i < KetQua.Length - 1)
Console.Write("\t{0}", KetQua[i] + "==>");
else Console.Write("\t{0}", KetQua[i]);
}
}
}
}
class Tester
{
static void Main()
{
DFS_LeoDoi A = new DFS_LeoDoi();
A.Nhap();
Tiểu luận Trí tuệ nhân tạo Sinh viên: - TK6LC1
Bài tập Tuần 1 11
A.Hien();
A.duyet();
Console.ReadKey();
}
}
1.2.4. Kết quả thực nghiệm:
Dữ liệu vào:
11
0 1 1 0 0 1 0 0 0 0 0
1 0 0 1 1 0 0 1 0 0 0
1 0 0 1 0 0 0 0 0 0 0
0 1 1 0 1 0 1 0 0 0 0

0 1 0 1 0 0 1 1 1 1 0
1 0 0 0 0 0 0 1 0 0 0
0 0 0 1 1 0 0 0 1 0 0
0 1 0 0 1 1 0 0 0 1 0
0 0 0 0 1 0 1 0 0 1 1
0 0 0 0 0 0 0 1 1 0 1
0 0 0 0 0 0 0 0 1 1 0
Dữ liệu ra:
- Nhập đỉnh xuất phát ĐinhXP= 1
- Nhập đỉnh xuất phát ĐinhKT= 10
- Kết quả: 1 = => 3 = => 6 = => 8 = => 10
1.3. Tìm kiếm A*.
1.3.1. Bài toán: Tìm kiếm.
1.3.2. Yêu cầu: Giải quyết bài toán tìm kiếm bằng thuật giải Tìm kiếm A*.
1.3.3. Mã nguồn chương trình:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
struct KetQuaduongDi
{
public int Dinh;
Tiểu luận Trí tuệ nhân tạo Sinh viên: - TK6LC1
Bài tập Tuần 1 12
public int Giatri_Gn;
public int Giatri_Fn;
}
class Node
{
public int TênDinh;

public int DuongDi_Gn;
public int DuongDithucTe_Fn;
public Node Link;
}
class Stack
{
public bool Empty(Node Sau)
{
return Sau == null;
}
public void Put(ref Node Sau, int TênDinh1, int DuongDi_Gn1,
int DuongDithucTe_Fn1)
{
Node q = new Node();
q.TênDinh = TênDinh1;
q.DuongDi_Gn = DuongDi_Gn1;
q.DuongDithucTe_Fn = DuongDithucTe_Fn1;
q.Link = null;
if (Empty(Sau))
{
Sau = q;
}
else
{
q.Link = Sau; Sau = q;
}
}
public Node Pop(ref Node Sau)
{
if (!Empty(Sau))

{
Node Q = Sau;
Sau = Sau.Link;
return Q;
}
else { Console.WriteLine("Danh sach rong"); return null; }
}
// Sap xep theo thu tu tang dan o dau danh sach la nho nhat
public void sort(Node Sau)
{
Node tmp, Q = Sau;
while (Q != null)
{
tmp = Q.Link;
while (tmp != null)
{
if (Q.DuongDithucTe_Fn > tmp.DuongDithucTe_Fn)
{
int tmp1 = Q.TênDinh;
Tiểu luận Trí tuệ nhân tạo Sinh viên: - TK6LC1
Bài tập Tuần 1 13
int tmp2 = Q.DuongDi_Gn;
int tmp3 = Q.DuongDithucTe_Fn;
//Đổi 2 đỉnh
Q.TênDinh = tmp.TênDinh;
tmp.TênDinh = tmp1;
//Đổi 2 DuongDi_Gn
Q.DuongDi_Gn = tmp.DuongDi_Gn;
tmp.DuongDi_Gn = tmp2;
// Đổi 2 DuongDithucTe_Fn

Q.DuongDithucTe_Fn = tmp.DuongDithucTe_Fn;
tmp.DuongDithucTe_Fn = tmp3;
}
tmp = tmp.Link;
}
Q = Q.Link;
}
}
}
class ThuatToanA : Stack
{
private int[] Hn;
static string path = @"danhsachcanh.txt";
static string path1 = @"trongso.txt";
public KetQuaduongDi[] KetQua; //Ket qua duong di
private int i, j, d = 0, n, xp, kt, Gn, Fn;
private int[,] e; //Danh sach canh
public void Nhap()
{
int hang = -1, cot = 0;
StreamReader h = new StreamReader(path);
string str = h.ReadLine();
Console.WriteLine(str);
n = int.Parse(str);
e = new int[n, n];
str = h.ReadLine();
while (str != null)
{
hang++;
cot = 0;

Console.WriteLine(str);
foreach (string tmp in str.Split(' '))
{
int x = int.Parse(tmp);
e[hang, cot] = x;
cot++;
}
str = h.ReadLine();
}
h.Close();
// Khoi tao ma tran trong so
using (StreamReader dr = File.OpenText(path1))
{
string str1 = dr.ReadLine();
// So phan tu nay cung bang so dinh cua ma tran
int sophantu = int.Parse(str1);
Tiểu luận Trí tuệ nhân tạo Sinh viên: - TK6LC1
Bài tập Tuần 1 14
Hn = new int[sophantu];
string[] tmp = new string[sophantu];
str1 = dr.ReadLine();
tmp = str1.Split(' ');
for (i = 0; i < tmp.Length; i++)
{
Hn[i] = int.Parse(tmp[i]);
}
}
}
public void Hien()
{

Console.WriteLine("Hien ma tran canh");
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
Console.Write("{0} ", e[i, j]);
Console.WriteLine();
}
Console.WriteLine("Hien ham danh gia");
for (i = 0; i < n; i++)
{
Console.Write("{0} ", Hn[i]);
}
Console.WriteLine();
// Nhập đỉnh xuất phát và kết thúc
Console.Write("Nhap dinh xuat phat DinhXP=");
xp = int.Parse(Console.ReadLine());
Console.Write("Nhap dinh ket thuc DinhKT=");
kt = int.Parse(Console.ReadLine());
}
private bool Duyet_Asao()
{
bool TimThay = false;
// Khoi tao doi tuong Stack
Stack A = new Stack();
// Khoi tao node Sau
Node Sau = new Node();
Sau = null;
// Khoi tạo Node Tmp
Node Tmp = new Node();
// Cho đỉnh xuất phát vào Stack

A.Put(ref Sau, xp, 0, Hn[xp] + 0);
// Đường đi từ đỉnh xp tới xp =0; nên đường đi thưc tế
= Đường chim bay + 0;
// Thực hiện vòng lặp
do
{
// Kiểm tra Stack có rỗng hay không
if (A.Empty(Sau))// Nếu đúng thì thoát khỏi chương trình
{
Console.WriteLine("Khong tim thay");
break;// Thoát khỏi chương trình
}
// Nếu không rỗng thì loại đỉnh ở cuối danh sách ra
Tmp = A.Pop(ref Sau);
Tiểu luận Trí tuệ nhân tạo Sinh viên: - TK6LC1
Bài tập Tuần 1 15
Console.WriteLine("Lay ra đinh {0} Khoang cach toi dinh
xuat phat {1} va khoang cach toi dinh ket thuc {2}", Tmp.TênDinh,
Tmp.DuongDi_Gn, Tmp.DuongDithucTe_Fn + "Co dinh con");
// Cho đỉnh vào mảng kết quả đường đi
Array.Resize(ref KetQua, ++d);
KetQua[d - 1].Dinh = Tmp.TênDinh;
KetQua[d - 1].Giatri_Gn = Tmp.DuongDi_Gn;
KetQua[d - 1].Giatri_Fn = Tmp.DuongDithucTe_Fn;
// Nếu đỉnh lấy ra trùng với đỉnh cân tìm thì kết thúc
if (Tmp.TênDinh == kt)
{
TimThay = true;
break;
}

// Nếu không tìm thấy thì xét các đỉnh con của đỉnh
vừa lấy ra
for (i = 0; i < n; i++)
{// e[Tmp.TênDinh,i] là khoảng cách giữa đỉnh lấy trong
danh sách ra và đỉnh con i kề với đỉnh lấy ra
if (e[Tmp.TênDinh, i] > 0)
{
Gn = Tmp.DuongDi_Gn + e[Tmp.TênDinh, i];
Fn = Gn + Hn[i];
A.Put(ref Sau, i, Gn, Fn);
Console.WriteLine("Vao dinh {0} và Gn :{1} va
Fn :{2} ", i, Gn, Fn);
}
}
// Thuật toán A* sẽ chọn đường đi thực tế nhỏ nhất
A.sort(Sau);
}
while (true);
return TimThay;
}
public void Duyet()
{
if (Duyet_Asao())
{
Console.WriteLine("Da tim thay ket qua");
Console.WriteLine("Duong di ngan nhat theo A* la:");
for (i = 0; i < KetQua.Length; i++)
{
if (i < KetQua.Length - 1) Console.Write ("Dinh: {0}, {1},
{2}\t", KetQua[i].Dinh, KetQua[i].Giatri_Gn, KetQua[i].Giatri_Fn + "==>");

else Console.WriteLine("Dinh:{0}, {1}, {2}",
KetQua[i].Dinh, KetQua[i].Giatri_Gn, KetQua[i].Giatri_Fn);
}
}
}
}
class TesTer
{
static void Main()
{
ThuatToanA TTA = new ThuatToanA();
Tiểu luận Trí tuệ nhân tạo Sinh viên: - TK6LC1
Bài tập Tuần 1 16
TTA.Nhap();
TTA.Hien();
TTA.Duyet();
Console.WriteLine();
Console.ReadKey();
}
}
1.3.4. Kết quả thực nghiệm:
Dữ liệu vào:
11
0 2 6 0 0 8 0 0 0 0 0
2 0 0 9 8 0 0 5 0 0 0
6 0 0 9 0 0 0 0 0 0 0
0 9 9 0 8 0 6 0 0 0 0
0 8 0 8 0 0 5 6 7 8 0
8 0 0 0 0 0 0 3 0 0 0
0 0 0 6 5 0 0 0 11 0 0

0 5 0 0 6 3 0 0 0 9 0
0 0 0 0 7 0 11 0 0 6 7
0 0 0 0 0 0 0 9 6 0 8
0 0 0 0 0 0 0 0 7 8 0
Dữ liệu ra:
- Nhập đỉnh xuất phát ĐinhXP= 1
- Nhập đỉnh xuất phát ĐinhKT= 3
- Kết quả:
Tiểu luận Trí tuệ nhân tạo Sinh viên: - TK6LC1
Bài tập Tuần 2 17
Tuần 2:
THUẬT GIẢI DI TRUYỀN
2.1. Bài toán.
2.2. Yêu cầu.
2.3. Mã nguồn chương trình.
Tiểu luận Trí tuệ nhân tạo Sinh viên: - TK6LC1
Bài tập Tuần 3 18
Tuần 3:
BIỂU DIỄN TRI THỨC BẰNG LOGIC VỊ TỪ CẤP TRONG PROLOG
3.1. Bài toán 1.
3.1.1. Bài toán:
Giả sử có các thông tin sau:
• Ông Ba nuôi con chó tên là Kiki.
• Ông Tư nuôi con mèo Titi và Bibi.
• Có hai người bị nghi là dã giết con mèo Bibi đó là ông Ba và ông Hai.
Mà ta biết rằng:
 Ai nuôi chó thì yêu động vật.
 Ai bị nghi là giết động vật mà không yêu động vật thì chắc chắn là
người đó đã giết động vật.
 Và đương nhiên chó, mèo là động vật.

3.1.2. Yêu cầu:
Hãy xây dựng CSTT cho các thông tin trên. Cài đặt CSTT đó bằng ngôn ngữ
ProLog để trả lời các câu hỏi sau:
1. Ai giết con mèo Bibi?
2. Ông Ba giết con mèo Titi phải không?
3. Ai giết con mèo Titi?
4. Ông Tư giết con mèo Bibi phải không?
3.1.3. Mã nguồn chương trình:
cho(kiki).
meo(titi).
meo(bibi).
nuoi(ba,kiki).
nuoi(tu,titi).
nuoi(tu,bibi).
nghigiet(ba,bibi).
nghigiet(hai,bibi).
Tiểu luận Trí tuệ nhân tạo Sinh viên: - TK6LC1
Bài tập Tuần 3 19
yeudv(X):-nuoi(X,Y),cho(Y).
giet(X,Y):-nghigiet(X,Y),not(yeudv(X)),dongvat(Y).
dongvat(X):-cho(X);meo(X).
3.1.4. Kết quả thực nghiệm:
Câu truy vấn:
1. Ai giết con mèo Bibi?
Đầu vào: ?- giet(X,bibi).
Đầu ra: X = hai
2. Ông Ba giết con mèo Titi phải không?
Đầu vào: ?- giet(ba,titi).
Đầu ra: No
3. Ai giết con mèo Titi?

Đầu vào: ?- giet(X,titi).
Đầu ra: No
4. Ông Tư giết con mèo Bibi phải không?
Đầu vào: ?- giet(tu,bibi).
Đầu ra: No
3.2. Bài toán 2.
3.2.1. Bài toán:
Giả sử có các thông tin sau:
• Tom, Ken, Kit, Bin, Toto, Titi là những con ngựa.
• Tom là mẹ của Bin và Kit. Ken là mẹ của Toto. Bin là mẹ của Titi.
• Kit thắng Titi và Toto.Toto thắng Titi.
Mà ta biết rằng:
 Nếu một con ngựa nào đó mà con của nó chạy nhanh thì con ngựa đó
có giá.
 Một con ngựa được gọi là chạy nhanh nếu nó đạt danh hiệu quán
quân.
 Bất kỳ một con ngựa nào khi thi đấu (đua) với bất kỳ con ngựa khác
mà nó đều thắng thì con ngựa đó đạt danh hiệu quán quân.
Tiểu luận Trí tuệ nhân tạo Sinh viên: - TK6LC1
Bài tập Tuần 3 20
3.2.2. Yêu cầu:
Hãy xây dựng CSTT cho các thông tin trên. Cài đặt CSTT đó bằng ngôn ngữ
PROLOG (dùng goal nội) để trả lời các câu hỏi sau:
1. Con ngựa nào có giá?
2. Bin có phải là con ngựa có giá không?
3.2.3. Mã nguồn chương trình:
ngua(tom).
ngua(ken).
ngua(kit).
ngua(bin).

ngua(toto).
ngua(titi).
me(tom,bin).
me(tom,kit).
me(ken,toto).
me(bin,titi).
thang(kit,titi).
thang(kit,toto).
thang(toto,titi).
cogia(X):-me(X,Y), chaynhanh(Y), ngua(X).
chaynhanh(Y):-quanquan(Y).
quanquan(X):- ngua(X), findall(Y,((thang(Y,_); thang(_,Y)),X\=Y),L),
thangmoingua(X,L).
thangmoingua(X,[Y]):-thang(X,Y),!.
thangmoingua(X,[H|T]):-thang(X,H),thangmoingua(X,T).
3.2.4. Kết quả thực nghiệm:
1. Con ngựa nào có giá?
Đầu vào: ?- cogia(X), nl,
write(X), nl.
Đầu ra: X = tom
2. Bin có phải là con ngựa có giá không?
Tiểu luận Trí tuệ nhân tạo Sinh viên: - TK6LC1
Bài tập Tuần 3 21
Đầu vào: ?- cogia(bin).
Đầu ra: No
3.3. Bài toán 3.
3.3.1. Bài toán:
Giả sử có các thông tin sau:
• Ông A và bà B kết hôn với nhau và sinh được 3 người con tên là C, D
và E.

• Vợ của C là Titi và họ đã sinh được 2 người con trai tên là C1 và C2.
• E lấy chồng và sinh được 1 con trai tên là Toto1 và 1 con gái tên là
Toto2. Chồng của E tên là Toto.
• D có vợ tên là NỞ và hiện họ chưa có con.
3.3.2. Yêu cầu:
Hãy xây dựng CSTT cho cây phả hệ (3 đời) gồm các luật cho các quan hệ sau:
• Mẹ vợ?
• Con dâu?
• Cháu nội?
Cài đặt CSTT đó bằng ngôn ngữ PROLOG (dùng goal nội) để trả lời các câu
hỏi sau:
1. Ông A có những cháu nội nào?
2. Bà B là Mẹ chồng của những ai?
3. Ai gọi ai là Mẹ vợ?
4. C1 có quan hệ anh em với ai?
5. Ông A là bố vợ của những ai?
6. Ai là Bố chồng của ai?
3.3.3. Mã nguồn chương trình:
nam(a).
nam(c).
nam(c1).
nam(c2).
nam(toto).
nam(toto1).
Tiểu luận Trí tuệ nhân tạo Sinh viên: - TK6LC1
Bài tập Tuần 3 22
nam(d).
nu(b).
nu(titi).
nu(e).

nu(toto2).
nu(no).
chong(a,b).
bo(a,c).
bo(a,d).
bo(a,e).
me(b,c).
me(b,d).
me(b,e).
chong(c,titi).
bo(c,c1).
bo(c,c2).
me(titi,c1).
me(titi,c2).
chong(toto,e).
bo(toto,toto1).
bo(toto,toto2).
me(e,toto1).
me(e,toto2).
chong(d,no).
mevo(X,Y):-me(X,Z),chong(Y,Z).
condau(X,Y):-chong(Z,X),me(Y,Z);cha(Y,Z),nu(X).
chaunoi(X,Y):-bo(Z,X),bo(Y,Z);me(Y,Z),nam(Z).
bovo(X,Y):- bo(X,Z),chong(Y,Z),nu(Z).
bochong(X,Y):- bo(X,Z),chong(Z,Y).
anhem(X,Y):- bo(A,X),bo(A,Y),me(B,X),me(B,Y).
Tiểu luận Trí tuệ nhân tạo Sinh viên: - TK6LC1
Bài tập Tuần 3 23
3.3.4. Kết quả thực nghiệm:
1. Ông A có những cháu nội nào?

Đầu vào: ?- chaunoi(X,a).
Đầu ra: X = c1 ; X = c2;
2. Bà B là Mẹ chồng của những ai?
Đầu vào: ?- condau(X,b).
Đầu ra: X = titi ; X = no; (X bằng Nở)
3. Ai gọi ai là Mẹ vợ?
Đầu vào: ?- mevo(X,Y).
Đầu ra: X = b ; Y = toto
4. C1 có quan hệ anh em với ai?
Đầu vào: ?- anhem(c1,Y).
Đầu ra: Y = c2
5. Ông A là bố vợ của những ai?
Đầu vào: ?- bovo(a,Y).
Đầu ra: Y = toto
6. Ai là Bố chồng của ai?
Đầu vào: ?- bochong(X,Y).
Đầu ra: X = a , Y = titi ;
X = a , Y = no;
Tiểu luận Trí tuệ nhân tạo Sinh viên: - TK6LC1
Bài tập Tuần 4 24
Tuần 4:
XÂY DỰNG HỆ CHUYÊN GIA DỰA TRÊN LUẬT TRONG PROLOG
4.1. Bài toán 1.
4.1.1. Bài toán:
Sử dụng Prolog để xây dựng một hệ các chuyên gia đơn giản.
4.1.2. Yêu cầu:
Xây dựng hệ chuyên gia hỗ trợ chuẩn đoán hư hỏng máy tính.
4.1.3. Mã nguồn chương trình:
% Author: Luong Xuan Hong - TK6LC1
% Date: 10/30/2009

% Xay dung cac luat du doan.
loimanhinh(X):- maytinh(X),casechay(X),manhinhkhonglen(X).
loimain(X):- maytinh(X), casekhongchay(X), dencasekhongsang(X),
manhinhkhonglen(X).
hongquat(X):- maytinh(X), dencasesang(X), quatkhongquay(X),
manhinhkhonglen(X).
loiram(X):- maytinh(X),manhinhlen(X),tiengkeu(X,Y).
loiocung(X):- maytinh(X), casechay(X), manhinhlen(X),
khongvaoduocwin(X).
maytinh('SamSung').
maytinh('Dell').
manhinhlen('SamSung').
tiengkeu('SamSung','Bipbip').
casekhongchay('Dell').
dencasekhongsang('Dell').
manhinhkhonglen('Dell').
4.1.4. Kết quả thực nghiệm:
1. ?- loiram(X).
X = 'SamSung'
Tiểu luận Trí tuệ nhân tạo Sinh viên: - TK6LC1
Bài tập Tuần 4 25
Vậy: Máy tính hiệu SamSung bị lỗi RAM.
2. ?- loimain(X).
X = 'Dell'
Vậy: Máy tính hiệu Dell bị lỗi Main.
4.2. Bài toán 2.
4.2.1. Bài toán:
Sử dụng Prolog để xây dựng một hệ các chuyên gia đơn giản.
4.2.2. Yêu cầu:
Xây dựng hệ chuyên gia hỗ trợ chuẩn đoán bệnh.

4.2.3. Mã nguồn chương trình:
caohuyetap(X):- benhnhan(X),nhucdau(X),thongan(X),hoamat(X).
camcum(X):- benhnhan(X), nhucdau(X), hoamat(X), chongmat(X),
sotcao(X).
sotret(X):- benhnhan(X),sot(X),retrun(X).
cumgiacamH5N1(X):- benhnhan(X), sotcao(X), honhieutungcon(X),
khotho(X), huyetapgiam(X).
benhnhan('Ong A').
benhnhan('Ong B').
sot('Ong A').
retrun('Ong A').
sotcao('Ong B').
honhieutungcon('Ong B').
khotho('Ong B').
huyetapgiam('Ong B').
4.2.4. Kết quả thực nghiệm:
?- cumgiacamH5N1(X).
X = 'Ong B'
Vậy: Ông B mắc cúm gia cầm.
Tiểu luận Trí tuệ nhân tạo Sinh viên: - TK6LC1
Tuần 5: Logic mờ và lập luận xấp xỉ 26
Tuần 5:
LOGIC MỜ VÀ LẬP LUẬN XẤP XỈ
5.1. Bài toán 1.
5.1.1. Bài toán:
Liều lượng asperine được xác định dựa trên 4 luật (Rules) sau:
o Rule 1: IF sốt nhẹ THEN liều lượng asperine thấp.
o Rule 2: IF sốt THEN liều lượng asperine bình thường.
o Rule 3: IF sốt cao THEN liều lượng asperine cao.
o Rule 4: IF sốt rất cao THEN liều lượng asperine cao nhất.

5.1.2. Yêu cầu:
Xây dựng hệ mờ dùng trong điều trị bệnh.
5.1.3. Mã nguồn chương trình:
5.1.4. Kết quả thực nghiệm:
5.2. Bài toán 2.
5.2.1. Bài toán:
Có 1 thùng chứa nước. Cần bơm nước vào thùng tự động bằng máy bơm. Tùy
vào mức nước trong thùng để bơm.
Mức độ valve mở (hoạt động bơm) dựa trên luật sau:
o Rule 1: If (level is Okay) then (valve is no_change)
o Rule 2: If (level is low) then (valve is open fast)
o Rule 3: If (level is hight) then (valve is close fast)
o Rule 4: If (level is Okay) and (rate is positive) then (valve is close_slow)
o Rule 5: If (level is Okay) and (rate is negative) then (valve is open_slow)
5.2.2. Yêu cầu:
Xây dựng hệ mờ dùng để điều khiển động cơ bơm nước.
5.2.3. Mã nguồn chương trình:
5.2.4. Kết quả thực nghiệm:
Tiểu luận Trí tuệ nhân tạo Sinh viên: - TK6LC1

×