2012-08-09 3 views
3

"생성 및 테스트"를 사용하여 암호 연산 퍼즐을 풀기 위해 프롤로그 코드를 작성하도록 요청 받았습니다. 예를 들어 나는 solve([R,O,B],[B,E,R,T],[N,O,R,E,S])을 얻었고 문자에 대한 할당을 찾아야합니다. 그래서이 코드 작성 :암호 연산 퍼즐 (프롤로그)

sum(List1,List2,SumList) :- 
    append(List1,List2,List3), 
    append(List3,SumList,AllList), 
    assign([0,1,2,3,4,5,6,7,8,9],AllList), 
    add_zero(List1,List1Z), 
    add_zero(List2,List2Z), 
    add_zero(SumList,SumListZ), 
    name(Num1,List1Z), 
    name(Num2,List2Z), 
    name(SumNum,SumListZ), 
    SumNum is Num1+Num2, 
    !. 

remove(X,[X|Xs],Xs). 
remove(X,[_|Ys],Res) :- 
    remove(X,Ys,Res). 

assign(Digits,[X|Tail]) :- 
    nonvar(X), 
    !, 
    assign(Digits,Tail). 
assign(Digits,[X|Tail]) :- 
    remove(X,Digits,D1), 
    assign(D1,Tail). 
assign(_,[]) :- 
    !. 

add_zero([X|Tail1],[Y|Tail2]) :- 
    !, 
    Y is X+48, 
    add_zero(Tail1,Tail2). 
add_zero([],[]) :- 
    !. 

을하지만 버그를 가지고 있고 그것을 찾을 수 없습니다 ... 당신이 나를 도와 드릴까요?

+2

매우 관련성이 높은 질문 : http://stackoverflow.com/questions/10925285/faster-implementation-of-verbal-arithmetic-in-prolog –

답변

2

코드의 문제점은 remove/3의 두 번째 절에서 제거되지 않은 항목을 유지하지 않는다는 것입니다.

remove(X,[Y|Ys],[Y|Res]):- 
    remove(X,Ys,Res). 

내가 SEND + MORE와 코드를 시도 = 돈과 그 절차를 수정 한 후 잘 작동 : 읽어야합니다.

그러나 ROB + BERT = NORES에 대한 해결책을 찾지 못했습니다 ... 많은 해가있는 this site에 따르면 방정식에는 해결책이 없습니다.

+1

rob + bert = nores : http : // bach .istc.kobe-u.ac.jp/llp/crypt.html – Haile

+1

@Haile : 링크를 제공해 주셔서 감사합니다. 그 정보로 대답을 향상 시켰습니다 ... – gusbro

+0

@gusbro 감사합니다! – Ygandelsman