1['D:/GK.2010.83a.pl'].
xxxxxxxxxx
11halt.
xxxxxxxxxx
21/* print hello world */
2go :- write("hello world").
注释:/* */, 或行注释: %, 结束用"."来表示。
运行结果
xxxxxxxxxx
31?- go.
2hello world
3true.
xxxxxxxxxx
31dog(jack). dog(cathy).
2cat(rose). cat(mike).
3animal(X):-dog(X).
语句(clauses)包括事实(facts)或规则(rules)两类。
例如:dog(fido)是事实, animal(X):-dog(X)是规则。
在dog(fido)中,dog是谓词(predicate), fido是实参(argument).
在animal(X):-dog(X)中,X是变量(variable). Prolog通过问问题(query)来执行。
xxxxxxxxxx
21?- animal(jack).
2true.
"?-"后面就是目标问题 (goal). 这里prolog会回答两种结果:true或false.
也可以带着变量问
xxxxxxxxxx
31?- animal(X).
2X = jack ;
3X = cathy.
变量用首字母大写的串来表示,事实首字母必须小写。
Prolog找到一个答案后,会回头重新找下一个答案, 多个答案用分号隔开。
有些内置的谓词可直接用作goal.
x1?- listing(dog).
2dog(jack).
3dog(cathy).
4
5true.
目标中可以含多个询问,用","隔开表示"与"的关系。
xxxxxxxxxx
91?- dog(X),cat(Y).
2X = jack,
3Y = rose ;
4X = jack,
5Y = mike ;
6X = cathy,
7Y = rose ;
8X = cathy,
9Y = mike.
数: 234, 23.4
字符串: 'Hello World', nl是回车换行
函数: likes(jack,rose)
变量: X,Y,Z
List: [a,[b,c,d],e,f]
有一些内置的常数,如:pi, e, inf.
操作符的定义
xxxxxxxxxx
11:- op(500,xfx,'is_parent').
尽管一般是这么使用
xxxxxxxxxx
11m is_parent t.
但也等同于谓词:
xxxxxxxxxx
21?- is_parent(m,t).
2true.
常见的算术操作符有: +,-,*,/, //, ^,abs(X),max(X,Y),sqrt(X).
xxxxxxxxxx
21?- 1 =:= sin(pi/2).
2true.
常见的逻辑操作符有:not, ";", ","
输入:
xxxxxxxxxx
41sayhi :-
2write('What is your name ?'),nl,
3read(X),
4write('Hi '),tab(2), write(X).
运行结果是
xxxxxxxxxx
51?- sayhi.
2What is your name ?
3|: 'Hui Li'.
4Hi Hui Li
5true.
又如
xxxxxxxxxx
81square :-
2write('Please input a Num: '),
3read(Num),
4do(Num).
5do(stop) :- !.
6do(Num) :-
7S is Num * Num,
8write('Square of '),write(Num),write(': '),write(S),nl, square.
运行结果是
xxxxxxxxxx
61?- square.
2Please input a Num: 5.
3Square of 5: 25
4Please input a Num: |: stop.
5
6true.
输出: write
输出ASCII码:
xxxxxxxxxx
41
2?- put(37),nl.
3%
4true.
读取每一项
xxxxxxxxxx
21writeall([]).
2writeall([A|L]):- write(A),nl,writeall(L).
xxxxxxxxxx
61?- writeall([i,'love','Beijing',[tian,an,men]]).
2i
3love
4Beijing
5[tian,an,men]
6true.
内置谓词
xxxxxxxxxx
111?- append([a,b,c],[1,2,3],L).
2L = [a, b, c, 1, 2, 3].
3
4?- member(a,[a,b,c]).
5true .
6
7?- length([a,b,c],X).
8X = 3.
9
10?- reverse([a,b,c],X).
11X = [c, b, a].
字符串与List的转换
xxxxxxxxxx
41?- name('helloworld',L).
2L = [104, 101, 108, 108, 111, 119, 111, 114, 108|...].
3
4?- name(X,[104,101,108,108,111,119,111,114,108,100]).X = helloworld.
借助List操作实现字符串操作
xxxxxxxxxx
41joinNew(Str1,Str2,Str3):-
2name(Str1,L1),name(Str2,L2),
3append(L1,L2,Result),
4name(Str3,Result).
xxxxxxxxxx
21?- joinNew('hello',' world',X).
2X = 'hello world'.