2013-10-03 64 views
1

我在Prolog中編寫了一個規則來創建一個事實,pit(x,y)。下面的這個規則被稱爲三次從我的主要功能,它插入三個坑,其中沒有他們在(1,1)或(1,2)或(2,1),但問題是,有時2坑具有相同的x和y,其中x和y只能從1到4。 (4x4網格)如何在Prolog中刪除重複的事實

placePit(_) :- Px is random(4)+1, 
       Py is random(4)+1, 
       write(Px), 
       write(' '), 
       writeln(Py), 
       (Px =\= 1; 
       Py =\= 1), 
       (Px =\= 1; 
       Py =\= 2), 
       (Px =\= 2; 
       Py =\= 1) 
       -> 
       pit(Px,Py); 
       placePit(4). 

我不希望這樣的事情發生,所以我寫的另一條規則來檢查2個坑是否相同第一,將擴展以後從數據庫中刪除任何一個。從我測試過的情況來看,儘管兩個坑看起來都是一樣的,但並沒有被解僱。我究竟做錯了什麼?如何刪除重複的事實?

pit(A,B) :- pit(C,D), 
      A = C, 
      B = D, 
      write('Duplicate'). 

PS。我在Prolog非常新。任何建議表示讚賞。

回答

0

也許這可以幫助,在假設你實際需要產生事實

:- dynamic(pit/2). 

pit(1,1). 
pit(1,2). 
pit(2,1). 

placePit(N) :- 
    N > 0, 
    Px is random(4)+1, 
    Py is random(4)+1, 
    (\+ pit(Px, Py)   % if not exist 
    -> assertz(pit(Px, Py)), % store 
    M is N-1    % generate another 
    ; M = N     % nothing changed, retry 
), 
    placePit(M).    % recursion is the proper Prolog way to do cycles 
placePit(0).    % end of recursion (we call it 'base case') 

你應該叫爲

?- placePit(3). 

它顯示了一點語法細節,像'if/then/else',在Prolog中有一個奇特的形式。

編輯完成後,你可以刪除不需要的坑/ 2,讓你的數據庫'乾淨'。 (注意,我假設 - 基於你的描述 - DB儲存坑/ 2對於進一步處理是有價值的)。

+0

謝謝。它工作得很好,但如何去除坑(1,1),坑(1,2)和坑(2,1)。我不想要這三個(也許我不夠清楚)。 – user2843720

+0

看我的編輯。也許基於列表的解決方案會更好,但是您的問題不會顯示任何列表使用情況...然後我堅持數據庫處理。 – CapelliC