2014-10-23 3 views
1

나는 일반 cryptarithmetic 같은 오전 + 오후 = DAY, SEND + 더 = 돈으로 퍼즐 ..일반 프롤로그는 cryptarithmetic 프로그램

내가 작성한 프로그램을 해결하기 위해 프로그램을 작성하기 위해 노력하고있어입니다

gsolve([H1,T1],[H2|T2],[H3|T3]):- 
    gsolvehelper([H1,T1],[H2|T2],[H3|T3],[0,1,2,3,4,5,6,7,8,9],0). 

gsolvehelper([H1,T1],[H2|T2],[H3|T3],D,C):- 
    ( var(H1)->select(H1,D,D1);D1=D), 
    ( var(H2)->select(H2,D1,D2);D2=D1), 
    ( X1 is H1+H2+C), 
    ( H3 is mod(X1,10)), 
    ( C1 is X1//10), 
    gsolvehelper(T1,T2,T3,D2,C1). 

입력 폼이다 : 처음 두리스트

gsolve([A,M],[P,M],[D,A,Y]). 

헤드는 두 번째 목록의 헤드와 새로운 캐리를 찾기 위해 수행하기 위해 첨가된다.

내가 오류입니다 :이 오류가 무엇인지 알아낼 수 없습니다

ERROR: is/2: Type error: `[]' expected, found `[2,_G3922]' ("x" must hold one character) 

. 누군가 이걸로 나를 도울 수 있습니까?

+0

표시하는 코드는 오류 메시지를 표시하지 않습니다. '/ 2 : ... [2, _Gxxxx]'가 아니라''./2 : ... [_Gxxxx]'를 제공합니다. 이것은 실제로 잘못된 목록 구조가 발생했다는 것을 의미합니다 (실제 목록 술어는' '[H | T]'는 Prolog에서 실제로''(H, T)'입니다. – lurker

+0

나는 (SWI7을 사용하여) usb와 같은 에러 메시지를 받는다. –

+0

@false 맞다. 나는 주장을하기 전에 적절하게 테스트 했어야한다. 나쁘다. lurker가이 오류를 얻지 못하기 때문에 이것이 다양한 Prolog에서 어떻게 작동하는지 알고 있습니까? –

답변

2

오류는 아마도 오타 일 것입니다 : [H1,T1], 몇 군데에 나타납니다. 이 오타로 인해 H2이 의도하지 않게 인스턴스화되어 합계 문에 문제가 발생합니다. 다음은 SWI7에서 오류를 재생하기 :

?- X is 1 + [1,_] + 3. 
ERROR: is/2: Type error: `[]' expected, found `[1,_G11068]' (a list) ("x" must hold one character) 

당신은 당신의 코드를 향상시킬 수있는 다른 방법이있다 : 당신은 단순히 gsolve/3의 인수를 전달하기 때문에

  • 당신이 머리를 사용할 필요가 없습니다가/tail-notation [H|T] 여기.
  • 두 번째 조건자를 gsolve/5으로 간단히 명명 할 수 있습니다. 두 번째 조건 자의 이름은 gsolve/3과 이미 다르므로 간단히 지정할 수 있습니다.
  • bsolve/5에있는 여러 개의 괄호는 불필요합니다. if/then 연산자 주위의 간격도 개선 될 수 있습니다.
  • mod/2///2의 조합을 사용하면 ///2의 반올림 (즉, 제로 방향, 일반적으로 적어도 ...)이 mod/2과 일치하지 않으므로 문제가 발생할 수 있습니다. div/2 (음의 무한대로 반올림)을 대신 사용하십시오. 위의에 따라

만들기 변경 내가 얻을 : 그것은 당신이 언급 한 오류 해결 이후

gsolve(L1, L2, L3):- 
    gsolve(L1, L2, L3, [0,1,2,3,4,5,6,7,8,9], 0). 

gsolve([H1|T1], [H2|T2], [H3|T3], D, C):- 
    ( var(H1) 
    -> select(H1, D, D1) 
    ; D1 = D 
), 
    ( var(H2) 
    -> select(H2, D1, D2) 
    ; D2=D1 
), 
    X1 is H1 + H2 + C, 
    H3 is mod(X1, 10), 
    C1 is div(X1, 10), 
    gsolve(T1, T2, T3, D2, C1). 

이것은, 그러나 ... 퍼즐 아직 해결되지 않습니다 -뿐만 아니라 일부 다른 것들 - - 여기에서 받아 들일 수 있어야합니다.

+0

고마워요. 적어도 지금은 해결할 수 있기를 바랍니다! – usb