2016-08-08 11 views
3

나는 프롤로그를 배우려고하고있다. 나는이 스크립트를 바라 보았다 :프롤로그에서 가능한 많은 솔루션 중 하나 얻기

:- use_module(library(clpfd)). 
puzzle([S,E,N,D] + [M,O,R,E] = [M,O,N,E,Y]) :- 
    Vars = [S,E,N,D,M,O,R,Y], 
    Vars ins 0..9, 
    all_different(Vars), 
    S*1000 + E*100 + N*10 + D + M*1000 + O*100 + R*10 + E #= M*10000 + O*1000 + N*100 + E*10 + Y, 
    M #\= 0, 
    S #\= 0. 

출처 : https://github.com/Anniepoo/prolog-examples/blob/master/sendmoremoney.pl

내가 지금처럼 실행하고 약간의 출력을 얻을 : 나에게 가능한 값의 범위를주고있다 그것은처럼 보이는

$ swipl -q -s sendmoremoney.pl 
?- puzzle(X). 
X = ([9, _G2009, _G2012, _G2015]+[1, 0, _G2024, _G2009]=[1, 0, _G2012, _G2009, _G2042]), 
_G2009 in 4..7, 
all_different([9, _G2009, _G2012, _G2015, 1, 0, _G2024, _G2042]), 
91*_G2009+_G2015+10*_G2024#=90*_G2012+_G2042, 
_G2012 in 5..8, 
_G2015 in 2..8, 
_G2024 in 2..8, 
_G2042 in 2..8. 

각 편지. 그러나 각 문자가 가능한 값 중 하나에 할당되는 단일 솔루션을 얻으려면 어떻게해야합니까? 아주 기본적인 질문처럼 보이지만, 나는 그것을 이해할 수 없습니다.

답변

2

좋아,이게 clpfd 질문과 같은 Prolog 질문이 아닌 것처럼 보입니다.

?- puzzle(As + Bs = Cs), label(As). 
As = [9, 5, 6, 7], 
Bs = [1, 0, 8, 5], 
Cs = [1, 0, 6, 5, 2] ; 
false. 

여기에 내 대답을 찾았 http://www.swi-prolog.org/man/clpfd.html

+0

's의 (X)를'를 파악하기위한, 그리고 문서에 연결을 위해! 연결된 예를 포함하여 인터넷에서 찾은 많은 예가 CLP (FD) 문서에서 찢어 지지만 적절한 컨텍스트가없고 나쁜 관행을 사용합니다. 문서를 먼저 읽은 다음 공식 정보를 사용하여 다른 텍스트의 결함을 찾으십시오! – mat

+2

@mat, 당신은 * clp (FD) * (clpfd * 태그의 이론적 개념과 주제)와 * clpfd * 구현을 혼동하는 것처럼 보입니다. (그 중 혼란스럽게도 SICStus Prolog와 SWI /? - 프롤로그). send-more-money 예제는 Pascal Van Hentenryck의 1989 년 책 * 논리 프로그래밍에서의 제약 만족 *에서 나온 것으로, 이후 CLP (FD)의 모든 텍스트에 사소한 구문 수정이 적용되었습니다. 어디서나 찢어진다면 거기에서 ... – jschimpf

+1

예는 다른 곳에서도 사용됩니다. 다른보다 나은 문서에 대한 링크는 마찬가지로 좋았을 것입니다. 이 구체적인 경우에는 예제가 복사 된 위치를 확인하는 데 사용되는 구체적인 구문을 참조하십시오. – mat