联合(Unification)
变量与任何项目: 变量可以与任何项目绑定,其中也包括变量
原始项目与原始项目: 两个原始项目(原子或整数)只有当它们相同时才能联合。
结构与结构: 如果两个结构的每个相应的参数能联合,那么这两个结构可以联合。
1 ?- (1,2,3)=(X,Y,Z). X = 1, Y = 2, Z = 3. 2 ?- (1,2,3)=(X,X,Z). false. 3 ?- (1,1,3)=(X,X,Z). X = 1, Z = 3. 4 ?- (1,X,3)=(X,1,Z). X = 1, Z = 3. 5 ?- (1,X,3)=(X,2,Z). false.
1 ?- (1,2,X)=(1,2,(3,4,5)). X = (3, 4, 5). 2 ?- (1,2,X)=(1,2,(3,4,Y)),Y=5. X = (3, 4, 5), Y = 5. %_表示不关心匹配内容 3 ?- (1,2,X,Y,7)=(1,2,(3,4,5),6,_). X = (3, 4, 5), Y = 6. 4 ?- X = Y, Y = hi, write(X). hi X = Y, Y = hi.
%swipl -s objs.pl
%Hansen
%room
room(kitchen).
%objects and location
%object(Name, Color, Size, Weight).
location(object(candle, red, small, 1), kitchen).
location(object(apple, red, small, 1), kitchen).
location(object(apple, green, small, 1), kitchen).
location(object(table, blue, big, 50), kitchen).
%current room
here(kitchen).
%can take something?
can_take(Thing) :-
here(Room),
location(object(Thing, _, small, _), Room).
can_take(Thing) :-
here(Room),
location(object(Thing, _, big, _), Room),
write('The '), write(Thing),
write(' is too big to carry.'), nl,
fail.
can_take(Thing) :-
here(Room),
not(location(object(Thing, _, _, _), Room)),
write('There is no '), write(Thing), write(' here.'), nl,
fail.
%out put the weight
write_weight(1) :- write('1 pound').
write_weight(W) :- W > 1, write(W), write(' pounds').
%list all things in a room
list_things(Place) :-
location(object(Thing, Color, Size, Weight), Place),
write('A '),write(Size),tab(1),
write(Color),tab(1),
write(Thing), write(', weighing '),
write_weight(Weight), nl,
fail.