【问题标题】:Using cuts in prolog to select facts from database在 prolog 中使用 cut 从数据库中选择事实
【发布时间】:2014-01-10 09:59:06
【问题描述】:

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

只选择最后一个事实:?

【问题讨论】:

  • 在您的示例中,P 不应大写。以大写字母开头的词是变量。规则也是如此
  • 一个有趣的练习
  • 是的,你是对的,一个拼写错误,感谢您指出这一点。
  • 确实是@CapelliC。

标签: prolog artificial-intelligence


【解决方案1】:

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

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

collect(Seen, L) :-
    p(X), \+ member(X, Seen), collect([X|Seen], L).
collect(All, All).

您可以实现 not_contains/2,而不是 \+ member(Elem,List)(读取 Elem 不在 List 中),其中包含显式剪切。

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

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

【讨论】:

  • 您的代码运行良好,除了它提供了访问其他事实的可能性,不仅是最后一个,但非常感谢:D
  • 我在 last_(Y) 上添加了一个剪辑,它就像一个魅力:last_(Y) :- collect([], [Y|_]),!。无论如何,我仍然没有得到这个剪裁的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
  • 2014-03-18
相关资源
最近更新 更多