在 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.
您可以将select
andmember
与收集所有回溯结果的谓词组合在一起,例如bagof
or findall
, or 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,因为它使用了一个cut并且谓词有副作用。重点是展示如何使用匹配和遍历列表的元素。