使用prolog中的cut来从数据库中选择事实

时间:2014-01-10 09:59:07

标签: prolog artificial-intelligence

我应该使用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),!.

仅选择最后一个事实:?

1 个答案:

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