📄 srq10.pl
字号:
/*********************************************************************** * A solution to SRQ (Self-referential quizzes) implemented in B-Prolog * Solution similar to N-queens problem solutions. * This involves only 10 FD variables in the domain 1..5. * Antonio J. Fernandez * *********************************************************************/q:- statistics(runtime,_),srq(L), statistics(runtime,[_,Y]), write(L), nl, write('time : '), write(Y).srq(Q):- Q=[Q1,Q2,Q3,Q4,Q5,Q6,Q7,Q8,Q9,Q10], domain(Q,1,5),%% Question 1 (Q1#=1)#<=>(Q4#=1)#/\(Q1#\=1)#/\(Q2#\=1)#/\(Q3#\=1), (Q1#=2)#<=>(Q3#=1)#/\(Q1#\=1)#/\(Q2#\=1), (Q1#=3)#<=>(Q2#=1)#/\(Q1#\=1), (Q1#=4)#<=>(Q1#=1), (Q1#=5)#<=>(Q1#\=1)#/\(Q2#\=1)#/\(Q3#\=1)#/\(Q4#\=1),%% Question 2 (Q2#=1)#<=>(Q3#=Q4), (Q2#=2)#<=>(Q4#=Q5), (Q2#=3)#<=>(Q5#=Q6), (Q2#=4)#<=>(Q6#=Q7), (Q2#=5)#<=>(Q7#=Q8),%% Question 3 (Q3#=1)#<=>(Q4#=1), (Q3#=2)#<=>(Q5#=1)#/\(Q4#\=1), (Q3#=3)#<=>(Q6#=1)#/\(Q4#\=1)#/\(Q5#\=1), (Q3#=4)#<=>(Q7#=1)#/\(Q4#\=1)#/\(Q5#\=1)#/\(Q6#\=1), (Q3#=5)#<=>(Q8#=1)#/\(Q4#\=1)#/\(Q5#\=1)#/\(Q6#\=1)#/\(Q7#\=1),%% Question 4 (Q4#=1)#<=>(Q2#=2), (Q4#=2)#<=>(Q4#=2)#/\(Q2#\=2), (Q4#=3)#<=>(Q6#=2)#/\(Q2#\=2)#/\(Q4#\=2), (Q4#=4)#<=>(Q8#=2)#/\(Q2#\=2)#/\(Q4#\=2)#/\(Q6#\=2), (Q4#=5)#<=>(Q10#=2)#/\(Q2#\=2)#/\(Q4#\=2)#/\(Q6#\=2)#/\(Q8#\=2),%% Question 5 (Q5#=1)#<=>(Q1#=3), (Q5#=2)#<=>(Q3#=3), (Q5#=3)#<=>(Q5#=3), (Q5#=4)#<=>(Q7#=3), (Q5#=5)#<=>(Q9#=3),%% Question 6 Bef in 0..1, Aft in 0..1, Bef #<=>(Q1#=4)#\/(Q2#=4)#\/(Q3#=4)#\/(Q4#=4)#\/(Q5#=4), Aft #<=>(Q7#=4)#\/(Q8#=4)#\/(Q9#=4)#\/(Q10#=4), SmD in 0..10, exactly(SmD,Q,4), (Q6#=1)#<=> Bef #/\ (#\ Aft), (Q6#=2)#<=> Aft #/\ (#\ Bef), (Q6#=3)#<=> Bef #/\ Aft, (Q6#=4)#<=>(SmD#=0), (Q6#=5)#<=>(Q6#=4),%% Question 7 (Q7#=1)#<=>(Q5#=5)#/\(Q6#\=5)#/\(Q7#\=5)#/\(Q8#\=5)#/\(Q9#\=5)#/\(Q10#\=5), (Q7#=2)#<=>(Q6#=5)#/\(Q7#\=5)#/\(Q8#\=5)#/\(Q9#\=5)#/\(Q10#\=5), (Q7#=3)#<=>(Q7#=5)#/\(Q8#\=5)#/\(Q9#\=5)#/\(Q10#\=5), (Q7#=4)#<=>(Q8#=5)#/\(Q9#\=5)#/\(Q10#\=5), (Q7#=5)#<=>(Q9#=5)#/\(Q10#\=5),%% Question 8 SmBCD in 0..10, exactly(SmB,Q,2), exactly(SmC,Q,3), SmBCD #= SmB + SmC + SmD, (Q8#=1)#<=>(SmBCD#=7), (Q8#=2)#<=>(SmBCD#=6), (Q8#=3)#<=>(SmBCD#=5), (Q8#=4)#<=>(SmBCD#=4), (Q8#=5)#<=>(SmBCD#=3),%% Question 9 SmA in 0..10, SmE in 0..10, SmAE in 0..10, 10 #= SmAE + SmBCD, (Q9#=1)#<=>(SmAE#=0), (Q9#=2)#<=>(SmAE#=1), (Q9#=3)#<=>(SmAE#=2), (Q9#=4)#<=>(SmAE#=3), (Q9#=5)#<=>(SmAE#=4),%% 10 #= SmAE + SmBCD,%% labeling.%%%% FIRST FAIL%% labeling([ff],Q).%% MIN Size, More constrained.%% labeling([ffc],Q).%% NORMAL labeling([],Q)./*****************************************************************************IMPORTANT.exactly(X,L,N) is true if X occurs exactly N times in the list L. ******************************************************************************/exactly(_, [], 0).exactly(X, [Y|L], N) :- X #= Y #<=> B, N #= M+B, exactly(X, L, M).
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -