father(zeb,john_boy_sr). father(john_boy_sr,john_boy_jr). ancestor(X,Y):-father(X,Y). ancestor(X,Y):-father(X,Y),ancestor(Z,Y).
|?-ancestor(zeb,Who). Who=john_boy_sr?a Who=john_boy_jr no
|?-(A,B,C)=(1,2,3). A=1 B=2 C=3 yes |?-[2,2,3]=[X,X,Z]. X=2 Z=3 yes例子很简单。列表拥有一项元组不具备的能力,即你可以通过 [Head|Tail]解构列表。当你将一个列表与这种结构合一时,Head将绑定列表的第一个元素,而Tail将绑定剩余元素,像这样:
|?-[a,b,c]=[Head|Tail]. Head=a Tail=[b,c] yes
|?-[]=[Head|Tail]. no |?-[a]=[Head|Tail]. Head=a Tail=[] yes再来看两个复杂的例子:
|?-[a,b,c]=[a|Tail]. Tail=[b,c] yes |?-[a,b,c]=[a|[Head|Tail]]. Head=b Tail=[c] yes |?-[a,b,c,d,e]=[_,_|[Head|_]]. Head=c yes
count(0,[]). count(Count,[Head|Tail]):-count(TailCount,Tail),Count is TailCount+1. sum(0,[]). sum(Total,[Head|Tail]):-sum(Sum,Tail),Total is Head+Sum. average(Average,List):-sum(Sum,List),count(Count,List),Average is Sum/Count.这些规则很简单。下面逐步说明他们的工作方式。
|?-append([oil],[water],[oil,water]). yes |?-append([oil],[water],[oil,slick]). no
|?-append([tiny],[bubbles],What). What=[tiny,bubbles] yes
|?-append([dessert_topping],Who,[dessert_topping,floor_wax]). Who=[floor_wax] yes下面的代码用于计算出可能的排列:
|?-append(One,Two,[apples,oranges,bananas]). One=[] Two=[apples,oranges,bananas]?a One=[apples] Two=[oranges,bananas] One=[apples,oranges] Two=[bananas] One=[apples,oranges,bananas] Two=[] no
concatenate([],List,List). concatenate([Head|[]],List,[Head|List]). concatenate([Head1|[Head2|[]]],List,[Head1,Head2|List]). concatenate([Head1|[Head2|[Head3|[]]]],List,[Head1,Head2,Head3|List]).
concatenate([],List,List). concatenate([Head|Tail1],List,[Head|Tail2]):-concatenate(Tail1,List,Tail2).