2013-04-26 13 views
1

나는 프롤로그를 처음 사용하며 코드에 무엇이 문제가 있는지 파악하는 데 어려움을 겪고 있습니다. 프롤로그의 순환 소수 검사

  • 회전이 N2에게 N의 회전을하게

    • numDigits는 N.에 Y에게 자릿수를 만드는 :

      isCircularPrime(N):- 
          prime(N), 
          numDigits(N, Y), 
          Y2 is Y-1, 
          rotate(N,Y,N2), 
          circularPrime(N2, Y2, Y2). 
      
      circularPrime(_, 0, _).  
      circularPrime(N, 1, _):-prime(N). 
      circularPrime(N, I, J):- 
          I > 1, 
          prime(N), 
          I2 is I-1, 
          rotate(N,J,N2), 
          circularPrime(N2,I2,J). 
      

      : 나는 지금까지 나는이 코드를 가지고 circular prime numbers 을 찾기 위해 노력하고있다 (예 : 12 -> 21). N이 소수 인 경우

    • 프라임 그렇지

    는 현재는 프라임 숫자가 아닌 원형 소수 (예를 들어 19, 23, 등)은 무한히마다 재귀 거짓 사실이다. 누군가 내가 잘못하고있는 것을 설명 할 수 있다면 정말 감사 할 것입니다.

    여기에 누군가가 자신을 위해이 테스트하고자하는 경우에는 다른 코드 :

    prime(2). 
    prime(3). 
    prime(N):- 
        N>3, 
        N mod 2 =\= 0, 
        \+ divisible(N,3). 
    
    divisible(N,I):- N mod I =:= 0. 
    divisible(N,I):- 
        I*I < N, 
        I2 is I + 2, 
        divisible(N, I2). 
    
    numDigits(N, 1):- 
        N<10, N>0. 
    numDigits(N, X):- 
        N2 is N/10, 
        numDigits(N2, Y), 
        X is (Y+1). 
    
    rotate(N, L, R):- 
        LastDigit is N mod 10, 
        Base is div(N, 10), 
        Exponent is L - 1, 
        Num is 10**Exponent, 
        NewBase is LastDigit*Num, 
        R is Base + NewBase. 
    
  • +0

    오히려 사용 '^' '**'대신에. – false

    답변

    3

    가 나는 문제가 numDigits/2 술어라고 생각합니다.

    그것은 해답의 모든 종류를 제공, 그래서 프로그램이 또 다시 되돌아 계속 :

    numDigits(1, X). 
    X = 1 ; 
    X = 2 ; 
    X = 3 ; 
    X = 4 ; 
    X = 5 etc... 
    

    numDigits/2 프로그램에 삭감을 추가 한 것이 제대로 동작하는 것 같다

    isCircularPrime(19). 
    false. 
    
    +0

    완벽하게 작동합니다. 감사합니다! – X3no