在prolog中使用cuts从数据库中选择事实

在prolog中使用cuts从数据库中选择事实,prolog,artificial-intelligence,Prolog,Artificial Intelligence,我应该使用Prolog cuts从事实数据库中获取第一个、第二个和最后一个事实,我找到了获取第一个和第二个事实的方法,但我找不到检索最后一个事实的解决方案。下面是一个示例: P(jack). P(john). P(alice). P(sarah). P(kyle). 仅选择第一个事实:first(X):-p(X) 仅选择第二个事实:second(Y):-p(X),p(Y),X\=Y,p(Y) 仅选择最后一个事实: 我看不到不使用否定、累加器和服务谓词成员的方法,但是由于否定(通过失败)是通过c

我应该使用Prolog cuts从事实数据库中获取第一个、第二个和最后一个事实,我找到了获取第一个和第二个事实的方法,但我找不到检索最后一个事实的解决方案。下面是一个示例:

P(jack).
P(john).
P(alice).
P(sarah).
P(kyle).
仅选择第一个事实:
first(X):-p(X)

仅选择第二个事实:
second(Y):-p(X),p(Y),X\=Y,p(Y)


仅选择最后一个事实:

我看不到不使用否定、累加器和服务谓词成员的方法,但是由于否定(通过失败)是通过cuts实现的,所以我打赌:

last_(Y) :- collect([], [Y|_]).

collect(Seen, L) :-
    p(X), \+ member(X, Seen), collect([X|Seen], L).
collect(All, All).
代替
\+成员(Elem,List)
(read Elem不在List中),您可以实现一个not\u contains/2,并在内部显式剪切

顺便说一句,您的第二个/1谓词包含一个冗余调用:应该是

second(Y):-p(X),p(Y),X\=Y,!.

在您的示例中,
P
不应该是大写。以大写字母开头的单词是变量。规则也是如此,一个有趣的练习是的,你是对的,一个打字错误,谢谢你指出。确实是@capelical。你的代码工作得很好,除了它提供了访问其他事实的可能性,不仅是最后一个,而且非常感谢:DI在最后一个添加了一个剪切,它像一个符咒一样工作:最后一个:—collect([],[Y |)······················,!. 反正我还是不懂这个东西。