Prolog专家系统----猫猫管理系统

 

系统分析

根据猫的特征区分猫名,人们去猫咖店撸猫的时候,为了方便帮助用户知道猫的名字,可以设计这样一个系统,通过猫的不同特定区分

比方小橘具有一下特征

毛色:橘色

尾巴:短

眼睛:蓝色

腿:黑色

是否有纹路:有

就可以通过以上的特定推断出系统中的唯一一只猫,它的名字叫小橘

动态数据库,保存已经查询过的属性

:- dynamic                                           
	catList/5,
   	leg/1,
    body/1,
	tail/1,
   	head/1,
    figure/1.
:- discontiguous cat/1.
:- set_prolog_flag(unknown, error).       

假设系统有8只猫

cat(xiaoJu):-
	leg(yellow),
    body(yellow),
	tail(yellow),
   	head(yellow),
    figure(yes).
cat(xiaoHei):-
	leg(black),
    body(black),
	tail(black),
   	head(black),
    figure(no).
cat(xiaoHua):-
	leg(red),
    body(yellow),
	tail(white),
   	head(green),
    figure(yes).
cat(xiaoBai):-
	leg(white),
    body(white),
	tail(white),
   	head(white),
    figure(no).
cat(xiaoPang):-
	leg(yellow),
    body(red),
	tail(white),
   	head(back),
    figure(yes).
cat(xiaoHui):-
	leg(gray),
    body(gray),
	tail(gray),
   	head(gray),
    figure(yes).
cat(xiaoHong):-
	leg(red),
    body(yellow),
	tail(red),
   	head(yellow),
    figure(no).
cat(xiaoFen):-
	leg(red),
    body(black),
	tail(red),
   	head(white),
    figure(yes).

回溯不同的特征的值

leg(X):-ask(leg,X).
body(X):-ask(body,X).
tail(X):-ask(tail,X).
head(X):-ask(head,X).
figure(X):-ask(figure,X).

当某个特征已经查询过时,就不在继续回溯,返回的是true

ask(A, V):-
	catList(yes, A, _), % succeed if true               
	!. % stop looking

当某特征已经查询过时,用户回答的不是yes时,也不在继续回溯,但返回的是false

ask(A, V):-
	catList(_, A, V), % fail if false             
	!, fail.

当某个特征值在动态数据库中还没有存在过,就可以询问用户

ask(A, V):-
  	write(A:V), % ask user
 	write('? : '),
  	read(Y), % get the answer
    /+catList(yes,A,_),
	asserta(catList(Y, A, V)), % remember it     
	Y == yes. % succeed or fail

回溯搜索数据库中的猫

search(X):-cat(X).

 用户进入查询模式

retractall为清空catList表!

solve:-
	retractall(catList(_,_,_)),
	search(X),
	write('This kitten is called ------ '),write(X),nl.
solve:-
	write('We no have such kittens here!'),nl.

总代码:

:- dynamic                                           
	catList/5,
   	leg/1,
    	body/1,
	tail/1,
   	head/1,
    	figure/1.
:- discontiguous cat/1.
:- set_prolog_flag(unknown, error).       
cat(xiaoJu):-
	leg(yellow),
    	body(yellow),
	tail(yellow),
   	head(yellow),
    	figure(yes).
cat(xiaoHei):-
	leg(black),
    	body(black),
	tail(black),
   	head(black),
    	figure(no).
cat(xiaoHua):-
	leg(red),
    	body(yellow),
	tail(white),
   	head(green),
    	figure(yes).
cat(xiaoBai):-
	leg(white),
    	body(white),
	tail(white),
   	head(white),
    	figure(no).
cat(xiaoPang):-
	leg(yellow),
    	body(red),
	tail(white),
   	head(back),
    	figure(yes).
cat(xiaoHui):-
	leg(gray),
    	body(gray),
	tail(gray),
   	head(gray),
    	figure(yes).
cat(xiaoHong):-
	leg(red),
    	body(yellow),
	tail(red),
   	head(yellow),
    	figure(no).
cat(xiaoFen):-
	leg(red),
    	body(black),
	tail(red),
   	head(white),
    	figure(no).

leg(X):-ask(leg,X).
body(X):-ask(body,X).
tail(X):-ask(tail,X).
head(X):-ask(head,X).
figure(X):-ask(figure,X).

ask(A, V):-
	catList(yes, A, _), % succeed if true               
	!. % stop looking

ask(A, V):-
	catList(_, A, V), % fail if false             
	!, fail.

ask(A, V):-
  	write(A:V), % ask user
 	write('? : '),
  	read(Y), % get the answer
    /+catList(yes,A,_),
	asserta(catList(Y, A, V)), % remember it     
	Y == yes. % succeed or fail
search(X):-cat(X).
solve:-
	retractall(catList(_,_,_)),
	search(X),
	write('This kitten is called ------ '),write(X),nl.
solve:-
	write('We no have such kittens here!'),nl.

测试:

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值