我應該使用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),!.
只能選擇最後一個事實: ?
我應該使用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),!.
只能選擇最後一個事實: ?
我看不到的方式,而不使用否定,蓄能器,以及服務謂語成員,但由於否定(由失敗)與削減實施,這是我的選擇:
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,!.
你的代碼工作的很好,除了它提供了訪問其他事實的可能性,不僅是最後一個,而且非常感謝:D –
我添加了一個cut last_(Y),它的工作方式就像一個魅力:last_(Y): - collect ([],[Y | _]),!。無論如何,我仍然無法得到這個裁員。 –
在您的例子中,'P'不應該是資本。以大寫字母開頭的詞是變量。規則也是如此 – Shevliaskovic
一個有趣的練習 – CapelliC
是的,你是正確的,一個錯字錯誤,謝謝指出。 –