You are on page 1of 18

Danh sch Danh sch v xut nhp

Nguyn B Dip B mn KHMT Khoa CNTT&TT i hc Cn Th Tp hp d liu c th t. C th khng c phn t hoc c nhiu phn t, cc phn t c khai bo bn trong ngoc vung v ngn cch bi du phy. [a] danh sch mt phn t [] danh sch rng
1 2 1 3 2

[34,tom,[2,3]] danh sch 3 phn t v phn t th 3 l mt danh sch c 2 phn t. Danh sch c th hp nht vi bin
|?- [Any, list, of elements] = X. X = [Any, list, of elements]? yes
nbdiep@cit.ctu.edu.vn 1 nbdiep@cit.ctu.edu.vn C2.1: Danh sch 2

nh ngha danh sch


Danh sch l mt cu trc quy. danh sch rng, [], l mt danh sch. Cu trc c dng [X, ] l mt danh sch nu X l mt term v phn [] l mt danh sch (c th rng). Thng thng k hiu
[Head|Tail] (| = k t x dc trn bn phm)

Phn u (head) v phn ui (tail)


|?-[a,b,c,d]=[Head|Tail]. Head = a, Tail = [b,c,d]? yes |?-[a,b,c,d]=[X|[Y|Z]]. X = a, Y = b, Z = [c,d]; yes |?-[a,b,c]=[W|[X|[Y|Z]]]. W = a, X = b, Y = c, Z = []? yes |?-[a|[b|[c|[]]]]= List. List = [a,b,c]? yes
C2.1: Danh sch 4

Head phi hp nht c vi mt term. Tail hp nht vi mt danh sch c s phn t bt k, k c danh sch rng, [].

|?-[a] = [H|T]. H = a, T = []; yes

|?-[] = [H|T]. no

nbdiep@cit.ctu.edu.vn

C2.1: Danh sch

nbdiep@cit.ctu.edu.vn

Hp nht danh sch


2 danh sch c th hp nht khi c s phn t bng nhau v cc phn t c th hp nht.
|?-[a,B,c,D]=[A,b,C,d]. A = a, B = b, C = c, D = d ? yes |?- [[X,a]]=[b,Y]. no Length 1 Length 2 |?-[(a+X),(Y+b)]=[(W+c),(d+b)]. W = a, X = c, Y = d? yes

S dng quy
quy gip chng trnh r rng v d hiu hn.
Ti sao ta phi vit li on code m ta vit?

D liu c trnh by quy v x l tun t d dng hn.


Trong cu trc ng php c cha chnh n VD: NP (Det) N (PP), PP P (NP) D liu c cu trc: mi i tng c cng cch x l

|?-[[a],[B,c],[]]=[X,[b,c],Y]. B = b, X = [a], Y = [] ? yes


C2.1: Danh sch 5

Cho php Prolog thc hin tm kim phc tp trong khng gian cc li gii nhng khng cn thit k gii thut ring.

nbdiep@cit.ctu.edu.vn

nbdiep@cit.ctu.edu.vn

C2.2: quy v x l kt qu

Trng hp dng v quy


Mt chng trnh c s dng quy cn t nht 2 phn: nh ngha trng hp dng.
Nu khng c phn ny chng trnh quy s khng bao gi dng! c gi l trng hp dng base case: is_a_list([]). Lun xut hin trc mnh quy

Hi t khi quy
chc chn v t s dng trng hp quy phi chuyn vn gn ti li gii hn. Khi x l danh sch ta c th b qua Head v quy phn Tail ca danh sch.
is_a_list([_|T]):is_a_list(T). Phn u c thay th bi bin v danh v khng cn s dng na

nh ngha cch gii quyt hoc chia nh vn c gi l trng hp quy recursive case:
is_a_list([_|T]):is_a_list(T).

Qua mi bc quy cn phi hi t n trng hp dng (tm n s kin fact).


Khng hi t is_older(Ancestor,Person):is_older(Someone,Person), is_older(Ancestor,Someone).

C th c hn 1 trng hp dng hoc 1 trng hp quy!


nbdiep@cit.ctu.edu.vn C2.2: quy v x l kt qu 7 nbdiep@cit.ctu.edu.vn C2.2: quy v x l kt qu 8

Hi t khi quy (2)


Chng trnh mu:
parent(tom,jim). parent(mary,tom). is_older(Old,Young):parent(Old,Young). is_older(Ancestor,Young):is_older(Someone,Young), is_older(Ancestor,Someone).

Hi t khi quy (3)


Chnh sa li:
parent(tom,jim). parent(mary,tom). is_older(Old,Young):parent(Old,Young). is_older(Ancestor,Young):parent(Someone,Young), is_older(Ancestor,Someone).

Cu truy vn tm tt c cc li gii s lp v hn:


|?-is_older(X,Y).
X = tom, Y = jim ? ; X = mary, Y = tom ? ; X = mary, Y = jim ? ; *loop*

Chng trnh c th sinh cc li gii v khng lp v tn.


|?-is_older(X,Y).
X = tom, Y = jim ? ; X = mary, Y = tom ? ; X = mary, Y = jim ? ; no

N lp v tn v mnh quy khng hi t ( do n chia hng tm kim). Nu v t is_older/2 khng thy t tin, n s quy chnh n.
nbdiep@cit.ctu.edu.vn C2.2: quy v x l kt qu 9

thu nh khng gian li gii chng ta nn kim tra Young c ph huynh trc khi quy. Theo hng ny chng trnh s khng tm li gii khng hin hu.
nbdiep@cit.ctu.edu.vn C2.2: quy v x l kt qu 10

V t x l danh sch: Member/2


Member/2 l v t nhiu ngi dng nh ngha nht Member/2 kim tra mt term c phi l phn t ca danh sch hay khng.
Tr v yes nu tn ti Tr v fails nu khng tn ti. | ?- member(c,[a,b,c,d]). u tin kim tra v t u xem Head hp nht c vi i s yes khng. Nu c th tr li thnh cng. Nu khng thnh cng tr li tht member(H,[H|_ ]). bi.

V t x l danh sch : Member/2


|?- member(ringo,[john,paul,ringo,george]).
Fail(1): member(ringo,[john|_]). (2): member(ringo,[_|paul,ringo,george]):Call: member(ringo,[paul,ringo,george]). Fail(1): member(ringo,[paul|_]). (2): member(ringo,[_|ringo,george]):Call: member(ringo,[ringo,george]). Succeed(1): member(ringo,[ringo|_]]).

member(H,[ _|T]):member(H,T).

1) member(H,[H|_]). 2) member(H,[_|T]):member(H,T).
C2.2: quy v x l kt qu

nbdiep@cit.ctu.edu.vn

C2.2: quy v x l kt qu

11

nbdiep@cit.ctu.edu.vn

12

B lu vt trong Prolog
S dng v t trace trong c ch dng lnh Prolog hin th lu vt qu trnh thc thi ca Prolog. Prolog s hin th:
Li gii no c tm n v vi i s no, Tm li gii thnh cng khng (Exit), C phi thc hin li khng hay tht bi.

Lu vt Member/2
| ?- trace. | ?- member(ringo,[john,paul,ringo,george]). 1 1 Call: member(ringo,[john,paul,ringo,george]) ? 2 2 Call: member(ringo,[paul,ringo,george]) ? 3 3 Call: member(ringo,[ringo,george]) ? 3 3 Exit: member(ringo,[ringo,george]) ? 2 2 Exit: member(ringo,[paul,ringo,george]) ? 1 1 Exit: member(ringo,[john,paul,ringo,george]) ? yes | ?- member(stuart,[john,paul,ringo,george]). 1 1 Call: member(ringo,[john,paul,ringo,george]) ? 2 2 Call: member(ringo,[paul,ringo,george]) ? 3 3 Call: member(ringo,[ringo,george]) ? 4 4 Call: member(stuart,[george]) ? 5 Call: member(stuart,[]) ? [ ] khng so khp [H|T] 5 5 5 Fail: member(stuart,[]) ? 4 4 Fail: member(stuart,[george]) ? 3 3 Fail: member(ringo,[ringo,george]) ? 2 2 Fail: member(ringo,[paul,ringo,george]) ? 1 1 Fail: member(ringo,[john,paul,ringo,george]) ? no

B lu vt hin th su tm thy li gii ca cy tm kim li gii.


K s cnh li gii l mc su ca cy.(Mc 0 cao nht).

tt b lu vt cn g notrace.

nbdiep@cit.ctu.edu.vn

C2.2: quy v x l kt qu

13

nbdiep@cit.ctu.edu.vn

C2.2: quy v x l kt qu

14

Thu nhp kt qu x l
C 3 cch ly li gii khi x l d liu trong Prolog:
1. X l kt qu trng hp dng v truyn kt qu quay lui. 2. Lu kt qu tch ly khi quy v xut kt qu ra trng hp dng. 3. quy trn bin cha gn v tch ly khi quay lui.

X l t di ln
nh ngha v t length/2,i s u tin l danh sch cn kim tra, i s th 2 nhn kt qu tr v s phn t ca danh sch . Ta c th s dng quy lp qua cc phn t ca danh sch. S dng v t is/2 m s phn t.
listlength([_|T],N1):listlength(T,N), N1 is N+1.

to b tch ly u tin phi khi to n vi 1 gi tr ban u (vd =0).


listlength([],0).

nbdiep@cit.ctu.edu.vn

C2.2: quy v x l kt qu

15

nbdiep@cit.ctu.edu.vn

C2.2: quy v x l kt qu

16

Lu vt x l t di ln
listlength([],0). listlength([_|T],N1):listlength(T,N), N1 is N+1. | ?- listlength([a,b,c],N). 1 1 Call: listlength([a,b,c],_489) ? 2 2 Call: listlength([b,c],_1079) ? 3 3 Call: listlength([c],_1668) ? 4 4 Call: listlength([],_2257) ? 4 4 Exit: listlength([],0) ? 5 4 Call: _1668 is 0+1 ? 5 4 Exit: 1 is 0+1 ? 3 3 Exit: listlength([c],1) ? 6 3 Call: _1079 is 1+1 ? 6 3 Exit: 2 is 1+1 ? 2 2 Exit: listlength([b,c],2) ? 7 2 Call: _489 is 2+1 ? 7 2 Exit: 3 is 2+1 ? 1 1 Exit: listlength([a,b,c],3) ? N = 3 ? yes
nbdiep@cit.ctu.edu.vn C2.2: quy v x l kt qu 17

listlength([],0). listlength([_|T],N1):listlength(T,N), N1 is N+1.

_= A, T=[b,c], N1=N0

| ?- listlength([a,b,c],N0).

listlength([b,c],Na) . listlength([c],Nb). Na is Nb+1.

N0 is Na+1. N0 is 2+1.

Na is 1+1. listlength([],Nc). Nb is Nc+1. Nb is 0+1. listlength([],0). Nc = 0


12/12/2012 Tng quan v Prolog 18

X l t di ln
listlength([],0). listlength([_|T],N1):N1 is N+1, listlength(T,N). |?-listlength([a,b,c],X). Instantiation error in is/2 fail listlength([],_). listlength([_|T],N):N1 is N+1, listlength(T,N1). |?-listlength([a,b,c],0). 1 Call: listlength([a,b,c],0) ? 2 2 Call: _1055 is 0+1 ? 2 2 Exit: 1 is 0+1 ? 3 2 Call: listlength([b,c],1) ? 4 3 Call: _2759 is 1+1 ? 4 3 Exit: 2 is 1+1 ? 5 3 Call: listlength([c],2) ? 6 4 Call: _4463 is 2+1 ? 6 4 Exit: 3 is 2+1 ? 7 4 Call: listlength([],3) ? 7 4 Exit: listlength([],3) ? 5 3 Exit: listlength([c],2) ? 3 2 Exit: listlength([b,c],1) ? 1 1 Exit: listlength([a,b,c],0)? yes
C2.2: quy v x l kt qu 19

Tch ly gi tr
Tch ly kt qu trong khi quy, thu kt qu cui cng trng hp dng.

listlength([],Acc,Acc).

Kt qu cui cng.

listlength([_|T],Acc,Out):Acc1 is Acc+1, Tng b m trong lc quy listlength(T,Acc1,Out).

ng nht kt qu ra bin xut v truyn ngc n ra

nbdiep@cit.ctu.edu.vn

nbdiep@cit.ctu.edu.vn

C2.2: quy v x l kt qu

20

Tch ly gi tr (2)
listlength([a,b,c],0,N). 1 1 Call: listlength([a,b,c],0,_501) ? 2 2 Call: _1096 is 0+1 ? 2 2 Exit: 1 is 0+1 ? 3 2 Call: listlength([b,c],1,_501) ? 4 3 Call: _2817 is 1+1 ? listlength([],A,A). 4 3 Exit: 2 is 1+1 ? listlength([_|T],A,O):5 3 Call: listlength([c],2,_501)? A1 is A+1, listlength(T,A1,O). 6 4 Call: _4538 is 2+1 ? 6 7 7 5 3 1 N = 3 ? yes 4 4 4 3 2 1 Exit: Call: Exit: Exit: Exit: Exit: 3 is 2+1 ? listlength([],3,_501) ? listlength([],3,3) ? listlength([c],2,3) ? listlength([b,c],1,3) ? listlength([a,b,c],0,3) ?

S dng v t ph tr
Thm v t ph tr xut gi tr b m.
listlength(List,Length):listlength2(List,0,Length). listlength2([],A,A). listlength2([_|T],A,O):A1 is A+1, listlength2(T,A1,O). Khi ng b m

V t ph tr

m bo b m hot ng chnh xc v ngi s dng khng cn quan tm n bn trong code

nbdiep@cit.ctu.edu.vn

C2.2: quy v x l kt qu

21

nbdiep@cit.ctu.edu.vn

C2.2: quy v x l kt qu

22

Kt hp danh sch
Thng thng b tch ly c s dng nht xy dng danh sch. Nu ta mun to mt danh sch mi kt hp t 2 danh sch c ta khng th gn danh sch 1 cho phn u danh sch mi v danh sch 2 cho phn ui danh sch mi c:
| ?- L1=[a,b], L2=[c,d], Z=[L1|L2]. L1 = [a,b], L2 = [c,d], Z = [[a,b],c,d] ?

Xy dng danh sch khi quy


|?- pred([a,b],[c,d],Out). Out = [a,b,c,d].
Kt qu mong mun

thm danh sch 1 vo 2 bng quy ta c th s dng du x dc phn tch tng phn t trong L1 v thm vo L2.
pred([H|T],L2,Out):pred(T,[H|L2],Out).
B tch ly

Ta cn ly tng phn t trong danh sch mt v thm vo danh sch hai. C 2 phng n thc hin: quy Quay lui tr kt qu.
nbdiep@cit.ctu.edu.vn C2.2: quy v x l kt qu 23

Chng ta cn thm bin (Out) truyn kt qu khi danh sch L1 ht phn t.


pred([],L2,L2). Trng hp dng: khi danh sch L1 ht phn t th to mt danh sch c cng s phn t v gn vo bin Out. Trng hp dng phi c t trc trng hp quy.
nbdiep@cit.ctu.edu.vn C2.2: quy v x l kt qu 24

Xy dng danh sch khi quy (2)


Cng mt bin

reverse/3
| ?- pred([a,b],[c,d],Out). 1 1 Call: pred([a,b],[c,d],_515) ? 2 2 Call: pred([b],[a,c,d],_515) ? 3 3 Call: pred([],[b,a,c,d],_515) ? 3 3 Exit: pred([],[b,a,c,d],[b,a,c,d]) ? 2 2 Exit: pred([b],[a,c,d],[b,a,c,d]) ? 1 1 Exit: pred([a,b],[c,d],[b,a,c,d]) ? Out = [b,a,c,d] ? yes Nu bn to danh sch theo reverse([],L2,L2). reverse([H|T],L2,Out):reverse(T,[H|L2],Out).
nbdiep@cit.ctu.edu.vn

| ?- pred([a,b],[c,d],Out). 1 1 Call: pred([a,b],[c,d],_515) ? 2 2 Call: pred([b],[a,c,d],_515) ? 3 3 Call: pred([],[b,a,c,d],_515) ? 3 3 Exit: pred([],[b,a,c,d],[b,a,c,d]) ? 2 2 Exit: pred([b],[a,c,d],[b,a,c,d]) ? 1 1 Exit: pred([a,b],[c,d],[b,a,c,d]) ? Out = [b,a,c,d] ? yes pred([],L2,L2). pred([H|T],L2,Out):pred(T,[H|L2],Out). Nu bn to danh sch theo qu trnh quy theo code bn th danh sch mi s c cc phn t mi th t ngc

qu trnh quy theo code bn th danh sch mi s c cc phn t c th t ngc

nbdiep@cit.ctu.edu.vn

C2.2: quy v x l kt qu

25

C2.2: quy v x l kt qu

26

Xy dng danh sch khi quay lui


xy dng danh sch theo ng th t cn iu chnh chng trnh, ch giai on quay lui . Thm phn t u ca L1 vo bin Out trong phn mc ca mnh . Head s c pred([H|T],L2,[H|Out]):- pred(T,L2,Out). thm vo khi
quay lui

append/3

Thit k trng hp dng: truyn L2 ra bin danh sch Out. Danh sch ny s thm Cc phn t L1 vo trong qu trnh quay lui. pred([],L2,L2).
Trng hp dng: Khi L1 ht phn t th to danh sch mi tng ng v truyn ra danh sch Out.

| ?- pred2([a,b],[c,d],Out). 1 1 Call: pred2([a,b],[c,d],_515) ? 2 2 Call: pred2([b],[c,d],_1131) ? 3 3 Call: pred2([],[c,d],_1702) ? 3 3 Exit: pred2([],[c,d],[c,d]) ? 2 2 Exit: pred2([b],[c,d],[b,c,d]) ? 1 1 Exit: pred2([a,b],[c,d],[a,b,c,d]) ? Out = [a,b,c,d] ? yes append([],L2,L2). append([H|T],L2,[H|Rest]):append(T,L2,Rest). * append/3 l v t ngi dng thng nh ngha khi x

Bin thay i mi ln c gi

l danh sch.
nbdiep@cit.ctu.ed u.vn C2.2: quy v x l kt qu 27 nbdiep@cit.ctu.edu.vn C2.2: quy v x l kt qu 28

append([],L2,L2). append([H|T],L2,[H|Rest]): append(T,L2,Rest).

( [H=a,T=b],L2=[c,d],Out=[a|Rest0] )

| ?- pred2([a,b],[c,d],Out). Out =[a| [b, c,d] ]

append vs reverse
C 2 v t reverse/3 and append/3 c th s dng ngc to danh sch t hiu ca 2 danh sch. y cng l mt cch hay loi b phn t trong danh sch.
| ?- append(X,Y,[a,b,c,d]). X = [], Y = [a,b,c,d] ? ; append([],L2,L2). X = [a], Y = [b,c,d] ? ; append([H|T],L2,[H|Rest]):X = [a,b], Y = [c,d] ? ; append(T,L2,Rest). X = [a,b,c], Y = [d] ? ; X = [a,b,c,d], Y = [] ? ; no |?-append(X,[c,d],[a,b,c,d]). X = [a,b] ? ; no

(H=b,T=[],L2=[c,d],Rest0=[b|Rest1]

append([b],[c,d],Rest0). Rest0 =[b| [c,d] ] append([],[c,d],Rest1). Rest1 = [c,d] append([],[c,d],Rest1). Rest1 = [c,d]

12/12/2012

Tng quan v Prolog

29

nbdiep@cit.ctu.edu.vn

C2.2: quy v x l kt qu

30

append vs reverse
. C 2 v t reverse/3 and append/3 c th s dng ngc
to danh sch t hiu ca 2 danh sch. y cng l mt cch hay loi b phn t trong danh sch

Built-in Predicates
var/1 nonvar/1 atom/1 atomic/1 number/1 integer/1 float/1 compound/1 ground/1 =../2 functor/3 arg/3 findall/3 setof/3 bagof/3
nbdiep@cit.ctu.edu.vn

Cc v t nhn dng terms

| ?- reverse(X,Y,[a,b,c,d]). X = [], Y = [a,b,c,d] ? ; X = [a], Y = [b,c,d] ? ; X = [b,a], Y = [c,d] ? ; X = [c,b,a], Y = [d] ? ; X = [d,c,b,a], Y = [] ? ; *loop* |?-reverse([d,c,b,a],Y,[a,b,c,d]). Y = [] ? yes

reverse([],L2,L2). reverse([H|T],L2,Out):reverse(T,[H|L2],Out).

V t phn tch cu trc

Thu tt c cc li gii

nbdiep@cit.ctu.edu.vn

C2.2: quy v x l kt qu

31

C2.3: V t dng sn

32

Identifying Terms
var(X) thnh cng nu X hin l bin cha hp nht vi gi tr bt k.

var/1, nonvar/1, atom/1


var(X)
thnh cng nu X hin l bin cha hp nht vi gi tr bt k. | ?- X = 5, var(X). no | ?- var([X]). no | ?- var(X). true ? yes

Cc v t kim tra loi ca Terms

nonvar(X) atom(X) number(X) integer(X)

Thnh cng nu X khng phi bin hoc l bin hp nht True nu X l mt atom True nu X l kiu s ( s nguyn hoc s thc)

nonvar(X)

Ngc li, nonvar/1 thnh cng nu X khng phi bin hoc l bin hp nht. | ?-nonvar([X]). true ? yes

)
float(X) atomic(X) compound(X) ground(X)
11/10/04

True nu X l kiu s nguyn True nu X l kiu s thc True nu X l kiu s hoc l atom True nu X l kiu cu trc Thnh cng nu X khng cha bin cha hp nht no
AIPP Lecture 6: Built-in Predicates 33

| ?- nonvar(X). | ?- X = 5,nonvar(X). no X = 5 ? yes

atom(X) True nu X l mt atom: term khng phi bin vi 0 i s, v khng phi kiu s
| ?- atom(paul). | ?- X = paul,atom(X). | ?- atom([]). yes X = paul ? yes | ?-atom([a,b]). no
nbdiep@cit.ctu.edu.vn C2.3: V t dng sn 34

number/1, integer/1, float/1


number(X) True nu X l kiu s ( s nguyn hoc s thc)
| ?- number(X). | ?- X=5,number(X). | ?- number(5.46). no X=5? yes yes

atomic/1, compound/1, ground/1


Nu atom/1 qu chi tit th c th s dng atomic/1 kim tra l kiu s v kiu atom.
| ?- atom(5). no | ?- atomic(5). yes

xc nh s l kiu g th s dng:
integer(X) True nu X l kiu s nguyn (thuc s nguyn dng hoc nguyn m, k c s 0). float(X) True nu X l kiu s thc.
| ?- integer(5). yes | ?- float(5). no | ?- integer(5.46). no | ?- float(5.46). yes

Nu atomic/1 fails th term kim tra c th l bin cha hp nht (kim tra vi v t var/1) hoc term phc hp :
|?-compound([]). |?-compound([a]). |?-compound(b(a)). no yes yes

ground(X) Thnh cng nu X khng cha bin cha hp nht no ( Kim tra c bn trong term phc hp).
|?-ground(X). no |?-ground(a). yes |?-ground(a(b,X)). no |?-ground([a,b,c]). yes
C2.3: V t dng sn 36

nbdiep@cit.ctu.edu.vn

C2.3: V t dng sn

35

nbdiep@cit.ctu.edu.vn

Phn tch cu trc


Khi s dng cu trc phc hp bn khng th s dng bin kim tra hoc s dng lm tn hm t.
|?- X=tree, Y = X(maple). Syntax error Y=X<<here>>(maple) functor(T,F,N) ca F. arg(N,Term,A) true nu F l hm t ca T v N l s ngi true nu A l i s th N.

Phn tch cu trc (2)


S dng v t =../2 phn tch cu trc thnh danh sch
cc thnh phn Term =.. L true nu L l mt danh sch cha hm t ca Term, theo sau l cc i s.
| ?- f(a,b) =.. L. L = [f,a,b] ? yes |?- T =.. [is_blue,sam,today]. T = is_blue(sam,today) ? yes

|?-functor(t(f(X),a,T),Func,N). |?-arg(2,t(t(X),[]),A). N = 3, Func = t ? A = [] ? yes yes | ?- functor(D,date,3), arg(1,D,11), arg(2,D,oct), arg(3,D,2004). D = date(11,oct,2004) ? yes
nbdiep@cit.ctu.edu.vn C2.3: V t dng sn 37 nbdiep@cit.ctu.edu.vn C2.3: V t dng sn 38

Thu ht cc li gii
Thu ht li gii bng cch g du ; ti du ngt trong terminal:
| ?- member(X, [1,2,3,4]). X = 1 ? ; X = 2 ? ; X = 3 ? ; X = 4 ? ; no

Siu v t (Meta-predicates)
findall/3, setof/3, v bagof/3 u l Siu v t (meta-predicates) Chng iu khin chin thut chng minh ca Prolog.
findall(X,P,L) setof(X,P,L) Tt c danh sch dn xut L ca tt c bin bagof(X,P,L) X m tha mn mc tiu P

Liu c cch sinh ra tt c li gii bn trong chng trnh khng? <= chuyn nghip hn! C 3 v t dng sn:
findall/3 setof/3 bagof/3
nbdiep@cit.ctu.edu.vn C2.3: V t dng sn 39

(v d: age(X,Age)). Chng s lin tc gi n mc tiu P, hp nht bin X vi P v thm n vo danh sch L. C 3 s thnh cng khi khng cn li gii. M phng chnh xc nh ta lin tc lp li du ; ti du ngc trong terminal tm tt c cc li gii.
nbdiep@cit.ctu.edu.vn C2.3: V t dng sn 40

findall/3
findall/3 c bnh chn l v t d s dng nht trong c 3:
| ?- findall(X, member(X, [1,2,3,4]), Results). Results = [1,2,3,4] yes

findall/3 (2)
C th s dng findall/3 theo nhiu cch. i s th 2 l mc tiu (c th l mc tiu phc hp):
| ?- findall(X, (member(X, [1,2,3,4]), X > 2), Results). Results = [3,4]? yes

C th c l: tm tt c X vi X l mt phn t ca danh sch [1,2,3,4]v t n vo danh sch kt qu Results'. Cc li gii s c lu trong danh sch kt qu theo th t m Prolog tm ra. Lu c li gii b trng, nu c v hn li gii v t findall/3 s khng dng li!
nbdiep@cit.ctu.edu.vn C2.3: V t dng sn 41

i s u tin c th l bt c dng term phc tp n u:


|?- findall(X/Y, (member(X,[1,2,3,4]), Y is X * X), Results). Results = [1/1, 2/4, 3/9, 4/16]? yes

nbdiep@cit.ctu.edu.vn

C2.3: V t dng sn

42

setof/3
setof/3 hot ng rt ging findall/3, tr 2 iu:
N sinh ra tp cc kt qu, khng c kt qu trng v cc kt qu c sp xp. Bt c bin no s dng trong mc tiu s khng xut hin trong i s th nht, setof/3 tr v tng kt qu mi khi hp nht c vi bin :
|?-setof(Child, age(Child,Age),Results). Age = 5, Results = [ann,tom] ? ; Age = 7, Results = [peter] ? ; Age = 8, Results = [pat] ? ; no

setof/3 (2)
Chng ta c th lng li gi vo setof/3 thu tt c cc kt qu c lp:
| ?- setof(Age/Children, setof(Child,age(Child,Age), Children), AllResults). AllResults = [5/[ann,tom],7/[peter],8/[pat]] ? yes

age(peter, 7). age(ann, 5). age(pat, 8). age(tom, 5). age(ann, 5). C s tri thc

nbdiep@cit.ctu.edu.vn

C2.3: V t dng sn

43

nbdiep@cit.ctu.edu.vn

C2.3: V t dng sn

44

bagof/3
bagof/3 kh ging setof/3 ngoi tr: Danh sch kt qu tr v c th b trng, Kt qu khng c sp xp.
| ?- bagof(Child, age(Child,Age),Results). Age = 5, Results = [tom,ann,ann] ? ; Age = 7, Results = [peter] ? ; Age = 8, Results = [pat] ? ; no

Tng hp li
V t s dng trn danh sch:
S dng b tch ly dng li kt qu trong qu trnh quy: reverse/3 Xy dng kt qu trong qu trnh quay lui: append/3

V t dng sn V t nhn dng


var/1, nonvar/1, atom/1, atomic/1, number/1, integer/1, float/1, compound/1, ground/1

bagof/3 khc findall/3 ch n sinh ra cc kt qu c lp cho tt c cc bin trong mc tiu m khng xut hin i s u tin.
| ?- findall(Child, age(Child,Age),Results). Results = [peter,pat,tom,ann,ann] ? ; no
nbdiep@cit.ctu.edu.vn C2.3: V t dng sn 45

Phn tch cu trc


=../2, functor/3, arg/3

Thu cc li gii
findall/3, setof/3, bagof/3

nbdiep@cit.ctu.edu.vn

C2.3: V t dng sn

46

Xut nhp trong Prolog


Prolog l ngn ng khai bo nn xut nhp c th gy hiu ng ph v th tc ph. Chc nng xut nhp rt kh biu din bng logic.

Xut nhp hot ng trong Prolog


Trong thi gian chy chng trnh Prolog, c 2 file c s dng: Input stream hin hnh output stream hin hnh. Mc nh 2 lung trn thit lp n ngi dng: Mi d liu nhp s thu nhn t terminal ngi dng Mi d liu xut s chuyn n terminal ngi dng C th khi ng a lung I/O nhng ch c 1 lung xut v mt lung nhp c th s dng ti mt thi im nht nh.

nbdiep@cit.ctu.edu.vn

C2.4 Xut nhp trong Prolog

47

nbdiep@cit.ctu.edu.vn

C2.4 Xut nhp trong Prolog

48

Xut d liu vi v t write/1


V t xut mc nh write/1. In term ra lung xut.
?- write(c), write(u_l), write(8), write(r). cu_l8r mc nh vit ra terminal. yes ?- write([a,b,c,d]). [a,b,c,d] yes

nh dng d liu xut


Ta c th s dng v t thit lp sn nh dng d liu xut: nl/0 = vit ra lung xut mt dng mi. tab/1 = vit ra lung xut mt s khong trng.
V t ny in ra s khong trng, khng phi in ra \tab!
|?- write(a), tab(3), write(b), nl, tab(1), write(c), tab(1), write(d), nl, tab(2), write(e). a b c d e yes

Ch chp nhn term ca Prolog nn d liu chui phi c bao ng trong du nhy n.
?- write(Hello World). syntax error ?- write(Hello World). Hello World yes

C th t to c php bng cch vit chui ngn cch.


|?- Day=04, Mth=11, Year=04, write(Day), write('/'), write(Mth), write('/'), write(Year). 4/11/4 Day=4, Mth=11, Year=4, yes

nbdiep@cit.ctu.edu.vn

C2.4 Xut nhp trong Prolog

49

nbdiep@cit.ctu.edu.vn

C2.4 Xut nhp trong Prolog

50

Xut k t ASCII
Ngoi cch vit c php bng chui c th s dng m ASCII (xem http://www.asciitable.com/). M ASCII l mt s t 1 n 127 thay th cho k t nh my.
A-Z = 65-90 a-z = 97-122 put/1 nhn i s l m ASCII v vit ra k t tng ng ln lung xut.
| ?- put(65),put(44),put(66),put(46). A,B. yes

M ASCII

=> C th s dng cng thc ton trn m ASCII:


| ?- X=32, put(65+X), put(44), put(66+X), put(46). a,b. Khi tng 32 n v tng ng vi chuyn ch hoa thnh ch thng. X = 32 ? yes

nbdiep@cit.ctu.edu.vn

C2.4 Xut nhp trong Prolog

51

nbdiep@cit.ctu.edu.vn

C2.4 Xut nhp trong Prolog

52

Xut danh sch chui


C th vit ra ni dung ca danh sch thay v vit tng phn t. Ta nh ngha v t quy writelist/1 nh sau:
writelist([]). writelist([H|T]):write(H), writelist(T). |?- X=Bob, writelist([The, ,man, was called ,X,.]). The man was called Bob. yes

Xut danh sch chui (2)


C 2 u c th iu chnh nh dng xut theo ta.
writelist2([H]):write(H), put(46), !. writelist2([H|T]):write(H), tab(1), writelist2(T). writefacts([]). writefacts([[X,Y]|T]):write(X), write('('), write(Y), write(')'), write('.'), nl, writefacts(T).

Ta c th nh ngha v t vit ni dung danh sch theo m ASCII :


putlist([]). putlist([H|T]):put(H), putlist(T).
nbdiep@cit.ctu.edu.vn

| ?- X='Bob', writelist2(['The',man,was,called,X]). The man was called Bob. X = 'Bob' ? ; no | ?- writefacts([[big,blue],[tickled,pink]]). big(blue). tickled(pink). yes

| ?- putlist([65,44,66,46]). A,B. yes

C2.4 Xut nhp trong Prolog

53

nbdiep@cit.ctu.edu.vn

C2.4 Xut nhp trong Prolog

54

Thay i lung xut


iu khin lung xut ra file bng v t tell/1.
Vd:

tell(Filename). tell(path/from/current/dir/to/Filename). V t s ni vi Prolog gi tt c d liu xut ra file. Nu file cha tn ti th n s c to ra, nu file c th s b ghi . Xc nh lung xut ang s dng bng v t telling/1. Prolog s chuyn lung xut n file cho ti khi : S dng tell/1 m lung mi ng lung ang s dng (file) bng v t told/0 . Sau khi ng lung xut s tr v lung xut chun (ngi dng).

| ?- write('Write to terminal'). Write to terminal yes | ?- telling(X). X = user ? yes | ?- tell('demo/test'). yes file to hoc b ghi thnh cng | ?- telling(X). X = 'demo/test' ? yes | ?- write('Now where does it go?'). yes d liu s cha xut hin trong file cho ti khi | ?- told. yes file c ng li. | ?- write('Oh, here it is!'). Oh, here it is! yes

nbdiep@cit.ctu.edu.vn

C2.4 Xut nhp trong Prolog

55

nbdiep@cit.ctu.edu.vn

C2.4 Xut nhp trong Prolog

56

V t nhp: read/1
Lung nhp chun l lung nhp t terminal ngi dng. Ta c th nhp term t dng lnh bng v t read/1. Ti dng lnh s hin th du |: v i ngi dng nhp 1 term vo (km theo du chm full-stop).
| ?- write('What is your name?'), nl, read(X), write('Greetings '), write(X). What is your name? |: tim. Greetings tim X = tim ? yes

V t nhp: read/1 (2)


read/1 ch hiu term kt thc vi du chm full-stop..
|?- read(X). |: hello . X = hello? yes |?- read(X). |: Hi there!. syntax error i du chm full-stop kt thc qu trnh nhp term. Nhp full-stop v thnh cng.

Tt nhin chui d liu phi c bao ng trong du nhy n


|?- read(X). |: Hi there!. X = Hi there!? yes

Bin c lu vo b lu bin t ng ca Prolog.


|?- read(X). |: blue(Moon). X = blue(_A)? yes
nbdiep@cit.ctu.edu.vn C2.4 Xut nhp trong Prolog 57 nbdiep@cit.ctu.edu.vn C2.4 Xut nhp trong Prolog 58

S khc nhau khi gia 2 du nhy


nhp kiu string c 2 cch: Nu c bao ng trong du nhy n th Prolog nhn ng tng ch mt.
| ?- read(X). |: 'Hi bob!'. X = 'Hi bob!' ? yes

V t name/2
S dng v t name/2 cng c th c bin theo m ASCII. V t name/2 s chuyn bt k term ca Prolog ( ngoi tr bin) ra m ASCII.
|?- name(aAbB,L). L = [97,65,98,66] ? yes |?- X=Make me ASCII, name(X,L). L = [77,97,107,101,32,109,101,32,65,83,67,73,73], yes

Nu c bao ng trong du nhy i th Prolog nhn l mt danh sch m ASCII.


| ?- read(X). |: "Hi bob!". X = [72,105,32,98,111,98,33] ? Yes

Hoc chuyn danh sch m ASCII thnh term ca Prolog.


|?- name(C, [72,101,108,108,111,32,87,111,114,108,100]). C = Hello World, yes

Hu dng khi phn on cu hoc to d liu nhp cho b chuyn DCG (chng 4).
nbdiep@cit.ctu.edu.vn C2.4 Xut nhp trong Prolog 59 nbdiep@cit.ctu.edu.vn C2.4 Xut nhp trong Prolog 60

V t get
Ta c th c tng k t thay cho vic c ton b term get0/1 (= get-zero) c mt k t t lung nhp hin hnh v tr v m ASCII ca k t.
| ?- get0(X). |: A X = 65? yes | ?- get0(X). |: h X = 32? Khong trng M ASCII ca khong trng

V t see/1
get/1 v get0/1 thng c s dng khi x l file vn bn. read/1 ch c th c term v th khng th c file cha vn bn. get/1 v get0/1 c tng k t v tr v m ASCII bt lun. see/1 chuyn lung nhp t file thay v nhp t ngi dng see(Filename). see(path/from/current/dir/to/Filename). seeing/1 hin th lung nhp ang s dng. File s c xem l ngun nhp cho n khi: M mt ngun nhp khc (s dng see/1) ng ngun nhp hin hnh bng seen/0 v tr v lung nhp t ngi dng.
nbdiep@cit.ctu.edu.vn AIPP Lecture 12: I/O 62

get/1 cng nng get0/1 nhng get/1 t ng loi b khong trng.


get(X). |: A X = 65? yes get(X). |: h X = 104 ? yes

C 2 u dng c k t, khng s dc c cho c term. C 2 u ko cn kt thc vi du chm full-stop.


nbdiep@cit.ctu.edu.vn AIPP Lecture 12: I/O 61

V t read
Khi ch nhp t file vn cn kch hot ta c th s dng x l ni dung ca n. Nu file nhp c cha term th ta ch c th c tun t 1 term.

Xut nhp a lung


Vic qun l nhiu lung xut nhp bng v t xy dng sn rt phc tp. write/1 v read/1 ch hot ng trn file hin hnh. Khng th bt c hoc ghi ln file ch nh . D liu ch c ghi ra file khi lung ng (s dng told/0) nhng told ch c th ng lung hin hnh. V th file xut phi c kch hot (s dng tell/1) trc khi ng file Nu mun s dng a lung xut nhp file bn phi s dng lung dnh cho xut nhp (stream-based I/O). Mt lung l b bin dch sinh ra con tr n file v cho php ta truy cp n file.

vd: file nhp tn l colours cha:

big(blue). tickled(pink). red_mist.

|?X = Y = Z = yes

see(demo/colours),read(X),read(Y),read(Z). big(blue), tickled(pink), red_mist ?

File c x l theo th t v b din dch nh term mi nn mi li gi read/1 s c term tip theo. c tip tc cho n khi end_of_file hoc nhp seen/0.

nbdiep@cit.ctu.edu.vn

AIPP Lecture 12: I/O

63

nbdiep@cit.ctu.edu.vn

AIPP Lecture 12: I/O

64

V t xut nhp lung


C nhiu v t phc tp qun l lung ( xem thm manual). Mt vi v t: open/3 m mt file c hoc ghi. i s s dng: Tn file; C ch m file (read/write/append); Tn lung (b bin dch sinh ra). N s c dng '$stream

V t xut nhp lung (2)


current_input/1 thnh cng nu i s l lung nhp hin ti. current_output/1 thnh cng nu i s l lung xut hin ti. set_input/1 s dng lung trong i s lm lung nhp hin ti (tng ng vi see/1). set_output/1 s dng lung trong i s lm lung xut hin ti (tng ng vi tell/1). Khi c thit lp l lung xut/nhp hin ti lung c th ghi (write/1) hoc c (read/1).

(2146079208).
Vd: open(demo/test,append,Stream). Lung s c khi to khi file c m, sau file s tham chiu s dng con tr lung (th m Lung hp nht), khng phi l tn lung.

nbdiep@cit.ctu.edu.vn

AIPP Lecture 12: I/O

65

nbdiep@cit.ctu.edu.vn

AIPP Lecture 12: I/O

66

V t xut nhp lung (3)


read/2 c mt term t lung, s dng i s: Lung s c; Term s c (hoc bin hp nht term vo). Vd: |?- open(file1,read,File1), read(File1,X). write/2 ghi mt term ra lung, s dng i s: Lung s ghi; Term ghi ra. e.g. |?- open(file2,write,File2), write(File2,X). C mt s v t xut nhp 2 i s cho php ch nh lung s dng. (vd: nl/1, tab/2, get/2, get0/2, put/2).

ng lung vi v t close/1
Khi s dng file lm lung xut, file ch thay i khi ng lung (s dng close/1).
| ?- open('demo/test1',write,Test), write(Test,'Hello'), close(Test). Test = '$stream'(2146079648) ? yes

S dng file lm lung xut nhp l phng thc truyn thng (nhng ph bin) xut-nhp d liu trong Prolog mc d phng thc ny c mt gii hn.

nbdiep@cit.ctu.edu.vn

AIPP Lecture 12: I/O

67

nbdiep@cit.ctu.edu.vn

AIPP Lecture 12: I/O

68

Cc v t xut nhp xy dng sn


write/[1,2] ghi term ra lung xut hin ti. nl/[0,1] ghi mt hng mi ra lung xut hin ti. tab/[1,2] ghi mt s khong trng ra lung xut hin ti. put/[1,2] ghi mt k t ASCII. read/[1,2] c mt term t lung nhp hin ti. get/[1,2] c mt k t ASCII in c t lung nhp (b khong trng). get0/[1,2] c mt k t ASCII t lung nhp see/1 t file lm lung nhp hin ti. seeing/1 Kim tra lung nhp hin ti. seen/0 ng lung nhp hin ti v tr v lung ngi dng. tell/1 t file lm lung xut hin ti. telling/1 Kim tra lung xut hin ti. told/0 ng lung xut hin ti v tr v lung ngi dng. name/2 i s 1 (atom) c m ASCII trong i s 2 (danh sch k t ASCII) khng

nbdiep@cit.ctu.edu.vn

AIPP Lecture 12: I/O

69

You might also like