Prolog 人工智能语言中文论坛---打造优质Prolog学习交流园地

一个供Prolog爱好者学习与交流的地方


您没有登录。 请登录注册

用prolog解“SEND+MORE=MONEY”

浏览上一个主题 浏览下一个主题 向下  留言 [第1页/共1页]

1 用prolog解“SEND+MORE=MONEY” 于 周日 二月 24, 2013 2:51 am

SEND+MORE=MONEY

查阅用户资料

2 回复: 用prolog解“SEND+MORE=MONEY” 于 周六 三月 09, 2013 2:55 pm

SEND+MORE=MONEY看来只要找一个SEND数,接着一个MORE数加起,就可以考核这二个数字总和的前四个数是不是MONEY的MONE。但是剩下那个Y没多少限制条件,所以当你找到SEND代表1000和MORE代表9000时,发现虽然MONEY 10000蛮符合,可接着就有点忙了,因为1001+9000=10001, 1002+9000=10002, 1003+9000=10003, ...... 等等。

且说明说明程序的写法:我让SEND, MORE尽可能单个数字彼此不相同,首先说你一个数的头一个数字是1~9其中一个,之後其他数字都是0~9其中一个,
代码:
fstDgt(D) :- between(1, 9, D).
digits([]).
digits([H|Rest]) :- between(0, 9, H), digits(Rest).

那麽,写下这一行就可以拿到SEND, MORE二个数,
代码:
:- fstDgt(S), fstDgt(M), digits([E,M,D,O,R]).

接着,要确定SEND和MORE每个数字彼此尽量不同,需要一个谓词称为notRedundant/1。这个谓词自己写起来是长这样,
代码:
notRedundant([]).
notRedundant([H|Rest]) :-
    not(headRedundant([H|Rest])),
    notRedundant(Rest).

headRedundant([H|Rest]) :-
    member(H, Rest).

材料准备充足了,可以开始写SEND+MORE=MONEY这一段的计算和确认的程序。我写下的包括几项动作:
1. 找到二个数SOME和MORE。
2. 把SEND和MORE相加,得到MONEY。
3. 确认MONEY的前四个数字拆开是M, O, N, E。
4. 确认SEND和MORE和MONEY每个数字彼此不同。
程序如下,
代码:
checkAdd(Send, More, Money) :-
    fstDgt(S), fstDgt(M), digits([E,N,D,O,R]),
    Send is 1000*S+100*E+10*N+D,
    More is 1000*M+100*O+10*R+E,
    Money is Send+More,
    M =:= Money div 10000,
    O =:= Money div 1000 - 10*M,
    N =:= Money div 100 - (100*M+10*O),
    E =:= Money div 10 - (1000*M+100*O+10*N),
    Y is Money - (10000*M+1000*O+100*N+10*E),
    notRedundant([S,M,E,N,D,O,R,Y]).

程序的最後加以下一行,可见结果。
代码:
:- bagof(Send+More=Money, checkAdd(Send, More, Money), Results), write(Results), nl.

查阅用户资料 http://yauhsien.wordpress.com

浏览上一个主题 浏览下一个主题 返回页首  留言 [第1页/共1页]

您在这个论坛的权限:
不能在这个论坛回复主题