我应该使用Prolog剪切来获取事实数据库中的第一个,第二个和最后一个事实,我找到了获得第一个和第二个的方法,但我找不到用于检索最后一个的方法事实上这是一个例子:
P(jack).
P(john).
P(alice).
P(sarah).
P(kyle).
仅选择第一个事实:first(X):-P(X),!.
仅选择第二个事实:second(Y):-P(X),P(Y),X\=Y,P(Y),!.
仅选择最后一个事实:?
答案 0 :(得分:2)
我没有看到没有使用否定,累加器和服务谓词成员的方法,但由于否定(通过失败)是通过削减实现的,这是我的赌注:
last_(Y) :- collect([], [Y|_]).
collect(Seen, L) :-
p(X), \+ member(X, Seen), collect([X|Seen], L).
collect(All, All).
而不是\+ member(Elem,List)
(读取Elem不在List中),你可以实现一个not_contains / 2,里面有明确的剪切。
BTW你的第二个/ 1谓词包含一个冗余调用:应该是
second(Y):-p(X),p(Y),X\=Y,!.