2013-10-03 4 views
1

사실, pit (x, y)를 만들기 위해 Prolog에서 규칙을 작성합니다. 아래의 규칙은 내 주요 기능에서 3 번 호출되며, (1,1) 또는 (1,2) 또는 (2,1)에 아무 것도없는 세 개의 피트를 삽입하고 있지만 문제는 때로는 2 피트 x와 y가 같을 때 x와 y는 1에서 4까지만 가능합니다. (4x4 그리드)프롤로그에서 중복 사실을 제거하는 방법

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 피트 동일 최초로 나중에 데이터베이스에서 ONE이든을 제거하려면 확장 여부를 확인하기 위해 물품. 필자가 테스트 한 것에서 볼 때 2 피트가 똑같은 것처럼 보이더라도 전혀 해고되지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 중복 사실을 제거하는 방법?

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

추신. 나는 프롤로그에서 매우 새로운 사람이다. 모든 제안을 부탁드립니다.

답변

0

어쩌면이 가정에 도움을 줄 수 당신이 실제로 사실을 생성하는 데 필요한 것 : 그것은 구문 세부의 조금을 보여줍니다

?- placePit(3). 

:- 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') 

당신이처럼 호출해야합니다 'if/then/else', Prolog에는 특이한 형식이 있습니다. 완료되면

편집, 당신은 DB를 '청소'얻기 위해 원치 않는 구덩이/2를, 제거 할 수 있습니다.

(필자는 귀하의 설명에 기반하여 DB가 pit/2를 저장하는 것이 추후 처리에 가치가 있다고 가정했음을 유의하십시오.)

+0

감사합니다. 그것은 아주 잘 작동하지만 피트 (1,1), 피트 (1,2) 및 피트 (2,1)를 제거하는 방법. 나는이 세 가지를 원치 않는다. – user2843720

+0

내 편집을 참조하십시오. 어쩌면 목록 기반 솔루션이 더 좋을지 모르지만 질문에 목록 사용법이 표시되지 않는다면 DB 처리에 집중해야합니다. – CapelliC