系统分析
根据猫的特征区分猫名,人们去猫咖店撸猫的时候,为了方便帮助用户知道猫的名字,可以设计这样一个系统,通过猫的不同特定区分
比方小橘具有一下特征
毛色:橘色
尾巴:短
眼睛:蓝色
腿:黑色
是否有纹路:有
就可以通过以上的特定推断出系统中的唯一一只猫,它的名字叫小橘
动态数据库,保存已经查询过的属性
:- 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.
测试: