我是Prolog的新手,我想做这样的事,但不知道从哪里开始。已经制作了矩阵以及如何使用Bounds库验证数字是否低于9,但就是这样,几天来一直在努力解决这个问题。
它应该是这样的:
2+7-4=5
+ - *
9-5*2=8
- + -
4*3-8=4
= = =
7 5 0
主要思想是给Prolog一个半填充矩阵,这样他就可以完成它。感谢您提前给我的任何信息或想法。
通过放置具有给定数字的运算符来解析方程的代码:
:- use_module(library(bounds)).
lista([X]) --> [X].
lista([H|T]) --> [H], op, lista(T).
op --> [+].
op --> [-].
op --> [*].
op --> [/].
op --> [''].
puzzle(Num, Res) :-
permutation(Num, Numbperm),
lista(Numbperm, Lista, []),
concat_atom([Res, =:=|Lista], At),
term_to_atom(Ev, At),
call(Ev),
write(Ev), nl.
答案 0 :(得分:2)
要使用clpfd,请使用library(clpfd)),而不是library(bounds)!
:- use_module(library(clpfd)).
我们可以说明必须遵守的约束:
m3x3_zs(Mss,Zs) :- Mss = [[M11,M12,M13], [M21,M22,M23], [M31,M32,M33]], Zs = [ M11,M12,M13 , M21,M22,M23 , M31,M32,M33 ], Zs ins 0..9, 5 #= M11+M12-M13, % row constraints 8 #= (M21-M22)*M23, % (see text below for details) 4 #= M31*M32-M33, 7 #= M11+M21-M31, % column constraints 5 #= M12-M22+M23, 0 #= M13*M23-M33.
请注意上面突出显示的目标8 #= <b>(M21-M22)*M23</b>
!如果我们使用A-B*C
的公共优先级规则,我们会有8 #= M21-(M22*M23)
,但这会排除您在OP中提供的示例解决方案[[2,7,4],[9,5,2],[4,3,8]]
。
现在让我们使用枚举谓词搜索所有解决方案
labeling/2
!
?- m3x3_zs(Mss,Zs), labeling([],Zs). Mss = [[0,5,0],[9,1,1],[2,2,0]], Zs = [0,5,0,9,1,1,2,2,0] ; Mss = [[0,5,0],[9,8,8],[2,2,0]], Zs = [0,5,0,9,8,8,2,2,0] ; Mss = [[0,7,2],[8,4,2],[1,8,4]], Zs = [0,7,2,8,4,2,1,8,4] ; Mss = [[0,8,3],[9,5,2],[2,5,6]], Zs = [0,8,3,9,5,2,2,5,6] ; Mss = [[1,4,0],[8,0,1],[2,2,0]], Zs = [1,4,0,8,0,1,2,2,0] ; Mss = [[1,4,0],[8,7,8],[2,2,0]], Zs = [1,4,0,8,7,8,2,2,0] ; Mss = [[1,5,1],[9,8,8],[3,4,8]], Zs = [1,5,1,9,8,8,3,4,8] ; Mss = [[1,6,2],[7,3,2],[1,8,4]], Zs = [1,6,2,7,3,2,1,8,4] ; Mss = [[1,7,3],[8,4,2],[2,5,6]], Zs = [1,7,3,8,4,2,2,5,6] ; Mss = [[1,8,4],[9,5,2],[3,4,8]], Zs = [1,8,4,9,5,2,3,4,8] ; Mss = [[2,3,0],[7,6,8],[2,2,0]], Zs = [2,3,0,7,6,8,2,2,0] ; Mss = [[2,4,1],[8,7,8],[3,4,8]], Zs = [2,4,1,8,7,8,3,4,8] ; Mss = [[2,5,2],[6,2,2],[1,8,4]], Zs = [2,5,2,6,2,2,1,8,4] ; Mss = [[2,6,3],[7,3,2],[2,5,6]], Zs = [2,6,3,7,3,2,2,5,6] ; Mss = [[2,7,4],[8,4,2],[3,4,8]], Zs = [2,7,4,8,4,2,3,4,8] ; Mss = [[3,2,0],[6,5,8],[2,2,0]], Zs = [3,2,0,6,5,8,2,2,0] ; Mss = [[3,3,1],[7,6,8],[3,4,8]], Zs = [3,3,1,7,6,8,3,4,8] ; Mss = [[3,4,2],[5,1,2],[1,8,4]], Zs = [3,4,2,5,1,2,1,8,4] ; Mss = [[3,5,3],[6,2,2],[2,5,6]], Zs = [3,5,3,6,2,2,2,5,6] ; Mss = [[3,6,4],[7,3,2],[3,4,8]], Zs = [3,6,4,7,3,2,3,4,8] ; Mss = [[4,1,0],[5,4,8],[2,2,0]], Zs = [4,1,0,5,4,8,2,2,0] ; Mss = [[4,2,1],[6,5,8],[3,4,8]], Zs = [4,2,1,6,5,8,3,4,8] ; Mss = [[4,3,2],[4,0,2],[1,8,4]], Zs = [4,3,2,4,0,2,1,8,4] ; Mss = [[4,4,3],[5,1,2],[2,5,6]], Zs = [4,4,3,5,1,2,2,5,6] ; Mss = [[4,5,4],[6,2,2],[3,4,8]], Zs = [4,5,4,6,2,2,3,4,8] ; Mss = [[5,0,0],[4,3,8],[2,2,0]], Zs = [5,0,0,4,3,8,2,2,0] ; Mss = [[5,1,1],[5,4,8],[3,4,8]], Zs = [5,1,1,5,4,8,3,4,8] ; Mss = [[5,3,3],[4,0,2],[2,5,6]], Zs = [5,3,3,4,0,2,2,5,6] ; Mss = [[5,4,4],[5,1,2],[3,4,8]], Zs = [5,4,4,5,1,2,3,4,8] ; Mss = [[6,0,1],[4,3,8],[3,4,8]], Zs = [6,0,1,4,3,8,3,4,8] ; Mss = [[6,3,4],[4,0,2],[3,4,8]], Zs = [6,3,4,4,0,2,3,4,8] ; false.
一点更具体怎么样?哪个解决方案中间有4
?
?- m3x3_zs(Mss,Zs), Mss=[_,[_,4,_],_], labeling([],Zs). Mss = [[0,7,2],[8,4,2],[1,8,4]], Zs = [0,7,2,8,4,2,1,8,4] ; Mss = [[1,7,3],[8,4,2],[2,5,6]], Zs = [1,7,3,8,4,2,2,5,6] ; Mss = [[2,7,4],[8,4,2],[3,4,8]], Zs = [2,7,4,8,4,2,3,4,8] ; Mss = [[4,1,0],[5,4,8],[2,2,0]], Zs = [4,1,0,5,4,8,2,2,0] ; Mss = [[5,1,1],[5,4,8],[3,4,8]], Zs = [5,1,1,5,4,8,3,4,8].