##有關於Prolog Prolog是一門邏輯編程語言,它於1972年由Alain Colmerauer和Phillipe Roussel開發完成,在 天然語言處理領域頗受歡迎。在Prolog中,數據以邏輯規則的形式存在,下面是基本 構建單元。編程
事實和規則被放入一個知識庫(knowledge base)。Prolog編譯器將這個知識庫編譯成一種適 於高效查詢的形式。
在Prolog中,第一個字母的大小寫是有着重要意義的,若是一個詞以小寫字母開頭,它就是一個原子(atom)——一個相似Ruby符號(symbol)的固定值,若是一個詞以大寫字母或下劃線開頭,那麼它就是一個變量。變量的值能夠改變,原子則不能。app
likes(wallace,cheese). //事實 likes(grommit,cheese). likes(wendolene,sheep). friend(X,Y) :- \+(X = Y), likes(X, Z), likes(Y, Z). //規則,\+執行邏輯取反操做,\+(X=Y)表示X不等於Y | ?- friend(grommit, wallace). //查詢
Prolog讓你經過事實和推論來表達邏輯,而後直接提問便可。dom
###合一 合一的意思是「找出那些使規則兩側匹配的值」編程語言
##第一天自習ide
創建一個知識庫,描述你最喜歡的書籍和其做者。atom
%--列出書籍 book('Zen and the Art of Motorcycle Maintenance'). book('Seven Languages in Seven Weeks'). book('Introduction to Algorithms'). book('Design Patterns'). book('Effective Java'). %--列出做者 author('Bruce A.Tate'). author('Erich Gamma'). author('Richard Helm'). author('Ralph Johnson'). author('John Vlissides'). author('Thomas H.Cormen'). author('Charles E.Leiserson'). author('Ronald L.Rivest'). author(' Clifford Stein'). author('Joshua Bloch'). author('Robert M. Pirsig'). book_author('Zen and the Art of Motorcycle Maintenance','Robert M. Pirsig'). book_author('Seven Languages in Seven Weeks','Bruce A.Tate'). book_author('Introduction to Algorithms','Thomas H.Cormen'). book_author('Introduction to Algorithms','Charles E.Leiserson'). book_author('Introduction to Algorithms','Ronald L.Rivest'). book_author('Introduction to Algorithms',' Clifford Stein'). book_author('Effective Java','Joshua Bloch'). book_author('Design Patterns','Erich Gamma'). book_author('Design Patterns','Richard Helm'). book_author('Design Patterns','Ralph Johnson'). book_author('Design Patterns','John Vlissides'). %--定義共同做者 coauthor( FirstAuthor, SecondAuthor ) :- (FirstAuthor \= SecondAuthor), author( FirstAuthor ), author( SecondAuthor ), book_author( SomeBook ,FirstAuthor), book_author( SomeBook, SecondAuthor). %--定義非共同做者 notCoauthor( FirstAuthor, SecondAuthor ) :- (FirstAuthor \= SecondAuthor), \+coauthor( FirstAuthor, SecondAuthor ).
查詢code
GNU Prolog 1.4.4 (64 bits) Compiled Apr 23 2013, 16:05:07 with cl By Daniel Diaz Copyright (C) 1999-2013 Daniel Diaz | ?- consult('D:/PrologCodes/books.pl'). compiling D:/PrologCodes/books.pl for byte code... D:/PrologCodes/books.pl compiled, 45 lines read - 4452 bytes written, 8 ms yes | ?- book(Whatbook). Whatbook = 'Zen and the Art of Motorcycle Maintenance' ? ; Whatbook = 'Seven Languages in Seven Weeks' ? ; Whatbook = 'Introduction to Algorithms' ? ; Whatbook = 'Design Patterns' ? ; Whatbook = 'Effective Java' (16 ms) yes | ?- author(Author). Author = 'Bruce A.Tate' ? ; Author = 'Erich Gamma' ? ; Author = 'Richard Helm' ? ; Author = 'Ralph Johnson' ? ; Author = 'John Vlissides' ? ; Author = 'Thomas H.Cormen' ? ; Author = 'Charles E.Leiserson' ? ; Author = 'Ronald L.Rivest' ? ; Author = ' Clifford Stein' ? ; Author = 'Joshua Bloch' ? ; Author = 'Robert M. Pirsig' | ?- book_author('Design Patterns',Author). Author = 'Erich Gamma' ? ; Author = 'Richard Helm' ? ; Author = 'Ralph Johnson' ? ; Author = 'John Vlissides' yes | ?- coauthor('Erich Gamma','Richard Helm'). true ? ; no | ?- notCoauthor('Erich Gamma','Richard Helm'). no | ?- coauthor('Bruce A.Tate','Erich Gamma'). no | ?- coauthor('Bruce A.Ta1te','Erich Gamma'). no | ?- notCoauthor('Erich Gamma','Richard Helm'). no | ?- book_author(SomeBook,'Erich Gamma'). SomeBook = 'Design Patterns' ? ; no
##次日自習orm
斐波那契數列和階乘的實現。排序
fib(1,1). fib(2,1). fib(N,Ret) :- N > 2, N1 is N -1, N2 is N -2, fib(N1,Prv1), fib(N2,Prv2), Ret is Prv2 + Prv1. factorial(0,1). factorial(1,1). factorial(N,Ret) :- N > 1, N1 is N - 1, factorial(N1, Ret1), Ret is N * Ret1.
漢諾塔問題ip
%--參考了網上的實現 hanoi(N) :- move(N,left,middle,right). move(1,A,_,C) :- inform(A,C), !. %-- 此處的!做用不太明白 move(N,A,B,C) :- N1 is N - 1, move(N1,A,C,B), inform(A,C), move(N1,B,A,C). inform(Loc1,Loc2) :- nl,write('Move a disk from '-Loc1-' to '-Loc2).
翻轉列表元素
reverse_list([],[]). reverse_list(List,ReverseList) :- List = [Head|Tail], reverse_list(Tail, ReverseTail), append(ReverseTail,[Head],ReverseList).
找出列表最小元素
find_min([E],E). find_min(List,Min) :- List = [Head|Tail], find_min(Tail,Min2), Min is min(Head,Min2).
對列表元素進行排序
sort_list([],[]). sort_list(List,SortedList) :- List = [Head|Tail], sort_list(Tail,SortedTail), merge_list(Head,SortedTail,SortedList). merge_list(E,[],[E]). merge_list(E1,SortedTail,MergedList) :- SortedTail = [E2|Tail], (E1 < E2 -> append([E1],SortedTail,MergedList); merge_list(E1,Tail,MergedTail), append([E2],MergedTail,MergedList) ).
##第三天自習
9x9數獨問題。
valid([]). valid([Head|Tail]) :- fd_all_different(Head), valid(Tail). sudoku(Puzzle, Solution) :- Solution = Puzzle , Puzzle = [S11,S12,S13,S14,S15,S16,S17,S18,S19, S21,S22,S23,S24,S25,S26,S27,S28,S29, S31,S32,S33,S34,S35,S36,S37,S38,S39, S41,S42,S43,S44,S45,S46,S47,S48,S49, S51,S52,S53,S54,S55,S56,S57,S58,S59, S61,S62,S63,S64,S65,S66,S67,S68,S69, S71,S72,S73,S74,S75,S76,S77,S78,S79, S81,S82,S83,S84,S85,S86,S87,S88,S89, S91,S92,S93,S94,S95,S96,S97,S98,S99], fd_domain(Puzzle,1,9), Row1=[S11,S12,S13,S14,S15,S16,S17,S18,S19], Row2=[S21,S22,S23,S24,S25,S26,S27,S28,S29], Row3=[S31,S32,S33,S34,S35,S36,S37,S38,S39], Row4=[S41,S42,S43,S44,S45,S46,S47,S48,S49], Row5=[S51,S52,S53,S54,S55,S56,S57,S58,S59], Row6=[S61,S62,S63,S64,S65,S66,S67,S68,S69], Row7=[S71,S72,S73,S74,S75,S76,S77,S78,S79], Row8=[S81,S82,S83,S84,S85,S86,S87,S88,S89], Row9=[S91,S92,S93,S94,S95,S96,S97,S98,S99], Col1=[S11, S21, S31, S41, S51, S61, S71, S81, S91], Col2=[S12, S22, S32, S42, S52, S62, S72, S82, S92], Col3=[S13, S23, S33, S43, S53, S63, S73, S83, S93], Col4=[S14, S24, S34, S44, S54, S64, S74, S84, S94], Col5=[S15, S25, S35, S45, S55, S65, S75, S85, S95], Col6=[S16, S26, S36, S46, S56, S66, S76, S86, S96], Col7=[S17, S27, S37, S47, S57, S67, S77, S87, S97], Col8=[S18, S28, S38, S48, S58, S68, S78, S88, S98], Col9=[S19, S29, S39, S49, S59, S69, S79, S89, S99], Square1=[S11,S12,S13, S21,S22,S23, S31,S32,S33], Square2=[S14,S15,S16, S24,S25,S26, S34,S35,S36], Square3=[S17,S18,S19, S27,S28,S29, S37,S38,S39], Square4=[S41,S42,S43, S51,S52,S53, S61,S62,S63], Square5=[S44,S45,S46, S54,S55,S56, S64,S65,S66], Square6=[S47,S48,S49, S57,S58,S59, S67,S68,S69], Square7=[S71,S72,S73, S81,S82,S83, S91,S92,S93], Square8=[S74,S75,S76, S84,S85,S86, S94,S95,S96], Square9=[S77,S78,S79, S87,S88,S89, S97,S98,S99], valid([Row1, Row2, Row3, Row4, Row5, Row6, Row7, Row8, Row9, Col1, Col2, Col3, Col4, Col5, Col6, Col7, Col8, Col9, Square1, Square2, Square3, Square4, Square5, Square6, Square7, Square8, Square9]), write( '\n' ), write( Row1 ), write( '\n' ), write( Row2 ), write( '\n' ), write( Row3 ), write( '\n' ), write( Row4 ), write( '\n' ), write( Row5 ), write( '\n' ), write( Row6 ), write( '\n' ), write( Row7 ), write( '\n' ), write( Row8 ), write( '\n' ), write( Row9 ).