2017-11-03 4 views
2

"SEND MODE MONEY"のPrologコードを書き込もうとしていました。これまでのところ、私が得た次暗号演算処理

?- puzzle([S,E,N,D] + [M,O,R,E] = [M,O,N,E,Y]). 

[ 9 , 5 , 6 , 7 ] + [ 1 , 0 , 8 , 5 ] = [ 1 , 0 , 6 , 5 , 2 ] ; 
S = 9, 
E = 5, 
N = 6, 
D = 7, 
M = 1, 
O = 0, 
R = 8, 
Y = 2. 

をしかし、私はない、私はそれを行うことができますどのように始めに終わりリストを印刷する次のよう

:- 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, 
    label([S,E,N,D,M,O,R,Y]), 
    format('~s ~w ~s ~w ~s ~w ~s ~w ~s ~s ~s ~w ~s ~w ~s ~w ~s ~w ~s ~s ~s ~w ~s ~w ~s ~w ~s ~w ~s ~w ~s ~s', 
     [ "[", S, ",", E, ",", N, ",", D, "]", 
     "+", "[", M, ",", O, ",", R, ",", E, "]", 
     "=", "[", M, ",", O, ",", N, ",", E, ",", Y, "]", ";" ]). 

出力がありますか?

私が取得する必要があり、出力は次のようになります。

?- puzzle([S,E,N,D] + [M,O,R,E] = [M,O,N,E,Y]). 
S = 9, 
E = 5, 
N = 6, 
D = 7, 
M = 1, 
O = 0, 
R = 8, 
Y = 2. 
[ 9 , 5 , 6 , 7 ] + [ 1 , 0 , 8 , 5 ] = [ 1 , 0 , 6 , 5 , 2 ] ; 

ありがとうございました。

+0

しかし、このリストを印刷することは句の一部であり、printintは変数ではありません。 –

+0

私はちょうどその方法で出力を表示したい、どうすればいいのですか? – Pramod

+2

代わりに、 '? - puzzle(Puzzle)。'への美しい答えを見てください! – false

答えて

3

Prologが提供する回答とは異なる形式の出力が必要な場合は、実際の関係を出力から完全に分離することをお勧めします。出力を扱う述語を書く

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, 
    label([S,E,N,D,M,O,R,Y]). 

:それでは、あなたの述語のパズル/ 1から最後のゴールを削除してみましょう。あなたの例を見てみましょう。それは、クエリを出力した後、変数置換、行ごとに1つ、最後に入力パズルを解決する数字で置換された文字で入力します。パズル/ 1):

output([S,E,N,D] + [M,O,R,E] = [M,O,N,E,Y]) :- 
    format('?- puzzle([S,E,N,D] + [M,O,R,E] = [M,O,N,E,Y]).~n'), 
    format('S = ~d,~nE = ~d,~nN = ~d,~nD = ~d,~nM = ~d,~nO = ~d,~nR = ~d,~nY = ~d.~n',[S,E,N,D,M,O,R,Y]), 
    format('~s ~w ~s ~w ~s ~w ~s ~w ~s ~s ~s ~w ~s ~w ~s ~w ~s ~w ~s ~s ~s ~w ~s ~w ~s ~w ~s ~w ~s ~w ~s ~s',[ "[", S, ",", E, ",", N, ",", D, "]", "+", "[", M, ",", O, ",", R, ",", E, "]", "=", "[", M, ",", O, ",", N, ",", E, ",", Y, "]", ";" ]). 

そして、あなたがそうあなただけの所望の出力が生成された引数なしで呼び出し述語を持っている:

puzzleout :- 
    puzzle(X), 
    output(X). 

あなたがパズルを解決し、他に何もしない述語を持っている。この方法を:

二行目は、あなたが入力したが、出力/ 1の最初のゴールによって出力として生成されたクエリではないことを

?- puzzleout. 
?- puzzle([S,E,N,D] + [M,O,R,E] = [M,O,N,E,Y]). 
S = 9, 
E = 5, 
N = 6, 
D = 7, 
M = 1, 
O = 0, 
R = 8, 
Y = 2. 
[ 9 , 5 , 6 , 7 ] + [ 1 , 0 , 8 , 5 ] = [ 1 , 0 , 6 , 5 , 2 ] ; 
true ; 
false. 

注:

は、そして、あなたはまた、あなたの所望の出力を生成し、述語を持っています。

+0

それは働いた。ありがとうございました – Pramod

+0

findall関数を使って可能な限りすべての結果を得ることができますか? – Pramod

+0

@Pramod:このパズルには1つの解決策しかないので、findall/3を使用するポイントは何ですか?単一の解をリストに入れたいのであれば、 '? - puzzle(P)、Bag = [P] .'を' Bag 'パズル(P)、バッグ) – tas