2014-01-10 110 views
2

我應該使用Prolog剪切從事實數據庫中獲取第一個,第二個和最後一個事實,我找到了一種方法來獲取第一個和第二個,但我可以「找不到這裏獲取最後的事實的解決方案就是一個例子:在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

在您的例子中,'P'不應該是資本。以大寫字母開頭的詞是變量。規則也是如此 – Shevliaskovic

+0

一個有趣的練習 – CapelliC

+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不在列表中),你可以實現一個not_contains/2,並在其中顯式切入。

BTW你的第二個/ 1謂詞包含冗餘呼叫:應該是

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

你的代碼工作的很好,除了它提供了訪問其他事實的可能性,不僅是最後一個,而且非常感謝:D –

+0

我添加了一個cut last_(Y),它的工作方式就像一個魅力:last_(Y): - collect ([],[Y | _]),!。無論如何,我仍然無法得到這個裁員。 –