我最近在Google Play应用商店中发现了一款名为Cryptogram的小游戏.有许多类似于这个的应用程序.我们的想法是将数字与颜色相匹配,以使所有方程听起来都是正确的.
我能够很快地解决问题1-8和问题10,但事实证明问题9对我来说更加困难.
经过一段时间的修补和猜测,我放弃了,决定编写一个解决方案.我使用Prolog/Datalog作为一些小任务作为本科生以及一些Project Euler问题.以前我见过使用Prolog的Constraint Logic Programming over Finite Domains(clpfd)库的15行数独求解器,我决定自己试一试.我正在使用SWI-Prolog.
:- use_module(library(clpfd)).
problem(Colors) :-
Colors = [Pink, Cyan, Yellow, Green, Purple, Red, Brown, White, Lime],
Colors ins 0..9,
all_distinct(Colors),
% The leading digit of a number can't be 0
Pink #\= 0,
Red #\= 0,
White #\= 0,
Green #\= 0,
Lime #\= 0,
Cyan #\= 0,
% I originally tried to write a predicate generalizing numbers and a list of …Run Code Online (Sandbox Code Playgroud) 看看以下目标(我使用来自Markus Triska的clpfd的swi-prolog):
result(Input,Result) :-
Input #> 10,
Result=decline.
result(Input,Result) :-
Input in 0..20,
Result=offer.
Run Code Online (Sandbox Code Playgroud)
可能的查询如下所示:
?- result(15,B).
B = decline ;
B = offer.
Run Code Online (Sandbox Code Playgroud)
我想添加订单或某种解决方案优先级.如果"拒绝"是有效的响应Input=15,则不应再考虑第二个目标,因此只有B=decline解决方案而不是B=offer.
我知道我可以添加一个!/0然后反过来也行不通.给我这个谓词的所有可能答案.
考虑到这个例子,a Result=offer应该只适用于Input 0..10,否则应该触发较高的先前下降目标.
当我尝试在谓词中考虑订单时,我是否认为太迫切了?