在prolog中,你如何模式匹配列表中的元素? 例如,如果列表是
[1/2,1/3,2/5,3/6]
然后你可以做类似
的事情one([..,1/A,..]) :- A=2.
one([..,1/A,..]) :- A=3.
感谢。
答案 0 :(得分: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.
您可以将select
和member
与收集所有回溯结果的谓词结合使用,例如bagof
或findall
或forall
(如果您需要副作用)
或者,如果您有兴趣,您实际上可以枚举所有元素,只匹配您需要的元素:
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,因为它使用剪切而谓词有副作用。关键是要展示如何使用匹配并迭代列表元素。