Prolog 第二个端视图拼图,序言

Prolog 第二个端视图拼图,序言,prolog,logic,constraints,swi-prolog,clpfd,Prolog,Logic,Constraints,Swi Prolog,Clpfd,我在swi prolog中编写代码来解决数字1-6的第二个端点视图Pazzles 7*7(例如5*5) :- [library(clpfd)]. gen_row(Ls):-length(Ls, 7), Ls ins 0..6. abc_view :- maplist(gen_row, [R1,R2,R3,R4,R5,R6,R7]), transpose([R1,R2,R3,R4,R5,R6,R7], [C1,C2,C3,C4,C5,C6,C7]), maplist(all_distinct

我在swi prolog中编写代码来解决数字1-6的第二个端点视图Pazzles 7*7(例如5*5)

:- [library(clpfd)].

gen_row(Ls):-length(Ls, 7), Ls ins 0..6.

abc_view :-

maplist(gen_row, [R1,R2,R3,R4,R5,R6,R7]),
transpose([R1,R2,R3,R4,R5,R6,R7], [C1,C2,C3,C4,C5,C6,C7]),
maplist(all_distinct, [R1,R2,R3,R4,R5,R6,R7]),
maplist(all_distinct, [C1,C2,C3,C4,C5,C6,C7]),

start(R1, 4),
start(R2, 2),
start(R3, 3),
start(R4, 5),
start(R5, 3),
finish(R1, 6),
finish(R2, 4),
finish(R3, 2),
finish(R5, 1),
finish(R7, 2),

start(C2, 3),
start(C3, 4),
start(C4, 3),
start(C5, 5),
start(C6, 4),
start(C7, 1),
finish(C1, 3),
finish(C2, 2),
finish(C3, 5),
finish(C4, 5),
finish(C5, 6),
finish(C6, 1),
finish(C7, 4),

    maplist(writeln, [R1,R2,R3,R4,R5,R6,R7]).
我需要编写怎样的逻辑来解决它,也许在更简单的4*4或5*5示例中。。 我很乐意得到任何帮助。
我需要为3个测试编写它,但即使是一个测试,它也将是grait。

我找到了一个解决方案,实际上这个问题比我解决的“SkyScrape&Fences”难题简单得多

恐怕我以前误解了这个问题,并发表了错误的评论,建议你放弃你已经走的(正确的)道路

/*  File:    second_end_view_puzzle.pl
    Author:  Carlo,,,
    Created: Oct  8 2012
    Purpose: help to solve Second End View puzzle as quested at
             https://stackoverflow.com/q/12717609/874024
*/


:- [library(clpfd)].

gen_row(Ls) :-
    length(Ls, 7),
    Ls ins 0..6.

abc_view :-

    Rows = [R1,R2,R3,R4,R5,_R6,R7],
    maplist(gen_row, Rows),
    transpose(Rows, [C1,C2,C3,C4,C5,C6,C7]),
    maplist(all_distinct, Rows),
    maplist(all_distinct, [C1,C2,C3,C4,C5,C6,C7]),

    start(R1, 4),
    start(R2, 2),
    start(R3, 3),
    start(R4, 5),
    start(R5, 3),
    finish(R1, 6),
    finish(R2, 4),
    finish(R3, 2),
    finish(R5, 1),
    finish(R7, 2),

    start(C2, 3),
    start(C3, 4),
    start(C4, 3),
    start(C5, 5),
    start(C6, 4),
    start(C7, 1),
    finish(C1, 3),
    finish(C2, 2),
    finish(C3, 5),
    finish(C4, 5),
    finish(C5, 6),
    finish(C6, 1),
    finish(C7, 4),

    maplist(label, Rows),
    maplist(writeln, Rows).

% place the constraint 'SECOND in that direction' using a reified check
start(Vars, Num) :-
    Vars = [A,B,C|_],
    X #<==> ( A #= 0 #\/ B #= 0 ) #/\ C #= Num,
    Y #<==> A #\= 0 #/\ B #= Num,
    X + Y #= 1 .

finish(Vars, Num) :-
    reverse(Vars, Sarv), start(Sarv, Num).
编辑这里是到GnupLog的“移植”。我已经从SWI Prolog CLP(FD)库中复制了转置/2代码

/*  File:    second_end_view_puzzle.pl
    Author:  Carlo,,,
    Created: Oct  8 2012
    Purpose: help to solve Second End View puzzle as quested at
             https://stackoverflow.com/q/12717609/874024
*/

gen_row(Ls) :-
    length(Ls, 7),
    fd_domain(Ls, 0, 6).

transpose(Ms, Ts) :-
        %must_be(list(list), Ms),
        (   Ms = [] -> Ts = []
        ;   Ms = [F|_],
            transpose(F, Ms, Ts)
        ).

transpose([], _, []).
transpose([_|Rs], Ms, [Ts|Tss]) :-
        lists_firsts_rests(Ms, Ts, Ms1),
        transpose(Rs, Ms1, Tss).

lists_firsts_rests([], [], []).
lists_firsts_rests([[F|Os]|Rest], [F|Fs], [Os|Oss]) :-
        lists_firsts_rests(Rest, Fs, Oss).

writeln(X) :- write(X), nl.

abc_view :-

    Rows = [R1,R2,R3,R4,R5,_R6,R7],
    maplist(gen_row, Rows),
    transpose(Rows, [C1,C2,C3,C4,C5,C6,C7]),
    maplist(fd_all_different, Rows),
    maplist(fd_all_different, [C1,C2,C3,C4,C5,C6,C7]),

    start(R1, 4),
    start(R2, 2),
    start(R3, 3),
    start(R4, 5),
    start(R5, 3),
    finish(R1, 6),
    finish(R2, 4),
    finish(R3, 2),
    finish(R5, 1),
    finish(R7, 2),

    start(C2, 3),
    start(C3, 4),
    start(C4, 3),
    start(C5, 5),
    start(C6, 4),
    start(C7, 1),
    finish(C1, 3),
    finish(C2, 2),
    finish(C3, 5),
    finish(C4, 5),
    finish(C5, 6),
    finish(C6, 1),
    finish(C7, 4),

    maplist(fd_labeling, Rows),
    maplist(writeln, Rows).

% place the constraint 'SECOND in that direction' using a reified check
start(Vars, Num) :-
    Vars = [A,B,C|_],
    X #<=> ( A #= 0 #\/ B #= 0 ) #/\ C #= Num,
    Y #<=> A #\= 0 #/\ B #= Num,
    X + Y #= 1 .

finish(Vars, Num) :-
    reverse(Vars, Sarv), start(Sarv, Num).
/*文件:second\u end\u view\u puzzle.pl
作者:卡洛,,,
创建日期:2012年10月8日
目的:帮助解决第二个终端视图难题
https://stackoverflow.com/q/12717609/874024
*/
日内瓦(Ls):-
长度(Ls,7),
fd_域(Ls,0,6)。
转置(Ms,Ts):-
%必须是(列表,Ms),
(Ms=[]->Ts=[]
;Ms=[F | |],
转置(F,Ms,Ts)
).
转置([],[u,[])。
转置([| Rs],Ms[Ts|Tss]):-
列出第一个休息(Ms、Ts、Ms1),
转置(Rs、Ms1、Tss)。
列出第一个休息([]、[]、[])。
列出第一个休息([[F|Os]| Rest]、[F|Fs]、[Os|Oss]):-
列出第一个和第二个(Rest、Fs、Oss)。
writeln(X):-write(X),nl。
abc_视图:-
行=[R1、R2、R3、R4、R5、R6、R7],
地图列表(gen_行,行),
转置(行[C1、C2、C3、C4、C5、C6、C7]),
地图列表(fd_所有不同行),
地图列表(所有不同的[C1、C2、C3、C4、C5、C6、C7]),
启动(R1,4),
启动(R2,2),
启动(R3,3),
启动(R4,5),
启动(R5,3),
饰面(R1,6),
完成(R2,4),
饰面(R3,2),
饰面(R5,1),
饰面(R7,2),
启动(C2,3),
启动(C3,4),
启动(C4,3),
启动(C5,5),
启动(C6,4),
启动(C7,1),
饰面(C1,3),
饰面(C2,2),
饰面(C3,5),
饰面(C4,5),
饰面(C5,6),
饰面(C6,1),
饰面(C7,4),
地图列表(fd_标签,行),
映射列表(writeln,行)。
%使用具体化检查放置约束“该方向的第二个”
开始(变量,数值):-
Vars=[A,B,C | 124;],
X#(A#=0#\/B#=0)#/\C#=Num,
Y#A#\=0#/\B#=Num,
X+Y#=1。
完成(变量,数量):-
反转(变量,Sarv),启动(Sarv,Num)。

我认为您不能在所有行/列上使用all_distinct,因为0(空单元格,不是吗?)可能会出现更多次…我不明白在什么情况下必须使用distinct,什么对我的任务更有利,只能有一个空单元格,是的,这里是0,这是我在大学里的第一个也是最后一个实验室,所以我对序言非常了解。你说得对。我误解了谜题、描述,正如其他人(已删除)的评论所指出的那样。我发现你对另一个类似于此的任务的答案,但我不理解它的完整代码,因为它在我的swi prolog中不起作用,它总是写为falseabc_视图。错。p、 我为我的愚蠢感到抱歉(我没有看到删除的注释。这是关于什么的?非常感谢解决方案。但是如何得到不同于的答案?-abc_view.false。?请显示程序如何给出结果查看最新编辑。调试时,我采取的方法最初注释掉大部分约束,然后添加一组约束。当约束好的,这会给出很多解决方案,只是“直观地”检查第一个、第二个等等。然后添加更多,直到覆盖整个集合。我不明白这一点。请帮助我,请一步一步地帮助我。首先,我在swi prolog.pl中创建文件,代码为/*文件:second\u end\u view\u puzzle.pl作者:Carlo,,,创建日期:2012年10月8日Purpose:帮助解决第二个终端视图难题,如*/:-模块(abc_视图,[abc_视图/0]):-[library(clpfd)]。gen_行(Ls):-长度(Ls,7),Ls-ins 0..6…完成(Vars,Num):-反转(Vars,Sarv),开始(Sarv,Num)。编译后在主窗口中?-我写“问题”abc_视图。只是双重检查:将程序复制到一个新文件中,编译并运行abc_视图以获得结果。如果您对效率感兴趣,此查询
?-时间(abc_视图)。
导致
%1002499推断,1349秒内1343 CPU(100%CPU,746670)
但我使用的是低功耗机器和SWI Prolog的调试版本,我这样做了,我的错误是什么?
/*  File:    second_end_view_puzzle.pl
    Author:  Carlo,,,
    Created: Oct  8 2012
    Purpose: help to solve Second End View puzzle as quested at
             https://stackoverflow.com/q/12717609/874024
*/

gen_row(Ls) :-
    length(Ls, 7),
    fd_domain(Ls, 0, 6).

transpose(Ms, Ts) :-
        %must_be(list(list), Ms),
        (   Ms = [] -> Ts = []
        ;   Ms = [F|_],
            transpose(F, Ms, Ts)
        ).

transpose([], _, []).
transpose([_|Rs], Ms, [Ts|Tss]) :-
        lists_firsts_rests(Ms, Ts, Ms1),
        transpose(Rs, Ms1, Tss).

lists_firsts_rests([], [], []).
lists_firsts_rests([[F|Os]|Rest], [F|Fs], [Os|Oss]) :-
        lists_firsts_rests(Rest, Fs, Oss).

writeln(X) :- write(X), nl.

abc_view :-

    Rows = [R1,R2,R3,R4,R5,_R6,R7],
    maplist(gen_row, Rows),
    transpose(Rows, [C1,C2,C3,C4,C5,C6,C7]),
    maplist(fd_all_different, Rows),
    maplist(fd_all_different, [C1,C2,C3,C4,C5,C6,C7]),

    start(R1, 4),
    start(R2, 2),
    start(R3, 3),
    start(R4, 5),
    start(R5, 3),
    finish(R1, 6),
    finish(R2, 4),
    finish(R3, 2),
    finish(R5, 1),
    finish(R7, 2),

    start(C2, 3),
    start(C3, 4),
    start(C4, 3),
    start(C5, 5),
    start(C6, 4),
    start(C7, 1),
    finish(C1, 3),
    finish(C2, 2),
    finish(C3, 5),
    finish(C4, 5),
    finish(C5, 6),
    finish(C6, 1),
    finish(C7, 4),

    maplist(fd_labeling, Rows),
    maplist(writeln, Rows).

% place the constraint 'SECOND in that direction' using a reified check
start(Vars, Num) :-
    Vars = [A,B,C|_],
    X #<=> ( A #= 0 #\/ B #= 0 ) #/\ C #= Num,
    Y #<=> A #\= 0 #/\ B #= Num,
    X + Y #= 1 .

finish(Vars, Num) :-
    reverse(Vars, Sarv), start(Sarv, Num).