2

在 prolog 中,如何对列表中的元素进行模式匹配?例如,如果列表像

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

然后你可以做类似的事情

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

谢谢。

4

1 回答 1

2

选择列表的元素可以通过多种方式完成,这取决于你想用它做什么。例如,使用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.

您可以将selectandmember与收集所有回溯结果的谓词组合在一起,例如bagofor 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并且谓词有副作用。重点是展示如何使用匹配和遍历列表的元素。

于 2013-04-03T06:17:47.170 回答