0
在序言中,如何模式匹配列表中的元素? 例如,如果列表就像如何在prolog中模式匹配列表中的元素?
[1/2,1/3,2/5,3/6]
,那麼你可以這樣做
one([..,1/A,..]) :- A=2.
one([..,1/A,..]) :- A=3.
感謝。
在序言中,如何模式匹配列表中的元素? 例如,如果列表就像如何在prolog中模式匹配列表中的元素?
[1/2,1/3,2/5,3/6]
,那麼你可以這樣做
one([..,1/A,..]) :- A=2.
one([..,1/A,..]) :- A=3.
感謝。
選擇列表中的元素可以通過多種方式完成,具體取決於您想要使用的方式。例如,使用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.
您可以收集回溯的所有結果,像bagof
或findall
,或forall
謂詞結合select
和member
(如果你需要副作用)
或者如果你覺得傾向,你實際上可以枚舉所有元素,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,因爲它採用了切割和謂詞有副作用。關鍵是要展示如何使用匹配並遍歷列表元素。
這並不完全清楚你想要達到的目標。從列表中選擇某個元素,還是匹配包含特定元素的列表? – 2013-04-03 05:42:11
通過匹配它的一部分從列表中選擇一個元素。 – omega