如何模式匹配prolog列表中的元素?

时间:2013-04-03 04:36:28

标签: list prolog pattern-matching

在prolog中,你如何模式匹配列表中的元素? 例如,如果列表是

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

然后你可以做类似

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

感谢。

1 个答案:

答案 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.

您可以将selectmember与收集所有回溯结果的谓词结合使用,例如bagoffindallforall(如果您需要副作用)

或者,如果您有兴趣,您实际上可以枚举所有元素,只匹配您需要的元素:

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,因为它使用剪切而谓词有副作用。关键是要展示如何使用匹配并迭代列表元素。