2013-04-03 98 views
0

在序言中,如何模式匹配列表中的元素? 例如,如果列表就像如何在prolog中模式匹配列表中的元素?

[1/2,1/3,2/5,3/6] 

,那麼你可以這樣做

one([..,1/A,..]) :- A=2. 
one([..,1/A,..]) :- A=3. 

感謝。

+0

這並不完全清楚你想要達到的目標。從列表中選擇某個元素,還是匹配包含特定元素的列表? – 2013-04-03 05:42:11

+0

通過匹配它的一部分從列表中選擇一個元素。 – omega

回答

1

選擇列表中的元素可以通過多種方式完成,具體取決於您想要使用的方式。例如,使用select/3

?- select(1/A, [1/2,1/3,2/5,3/6], Rest). 
A = 2, 
Rest = [1/3, 2/5, 3/6] ; 
A = 3, 
Rest = [1/2, 2/5, 3/6] ; 
false. 

或者使用member/2

?- member(1/A, [1/2,1/3,2/5,3/6]). 
A = 2 ; 
A = 3 ; 
false. 

您可以收集回溯的所有結果,像bagoffindall,或forall謂詞結合selectmember(如果你需要副作用)

或者如果你覺得傾向,你實際上可以枚舉所有元素,matchi NG只有那些你需要:

foo([1/A|Xs]) :- !, write(A), nl, foo(Xs). 
foo([_X|Xs]) :- foo(Xs). 
foo([]). 

?- foo([1/2,1/3,2/5,3/6]). 
2 
3 
true. 

雖然我感覺這最後一個不是很好的Prolog,因爲它採用了切割和謂詞有副作用。關鍵是要展示如何使用匹配並遍歷列表元素。