Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
memo on POTASSCO User Guide

"Potassco User Guide" 読書会 #01

https://kigok.connpass.com/event/81215/

% A problem instance
peg(a;b;c).
disk(1..4).
init_on(1..4,a).
goal_on(1..4,c).
moves(15).

% Generate
{ move(D,P,T) : disk(D), peg(P) } = 1 :- moves(M),T = 1..M.

% Define
move(D,T)   :- move(D,_,T).
on(D,P,0)   :- init_on(D,P).
on(D,P,T)   :- move(D,P,T).
on(D,P,T+1) :- on(D,P,T), not move(D,T+1),not moves(T).
blocked(D-1,P,T+1) :- on(D,P,T), not moves(T).  % on(D-1,P,T)は要求されていない。いなくてもblocked
blocked(D-1,P,T)   :- blocked(D,P,T), disk(D).  % blockedは次状態での状態。
% 全ての盤は次状態で、blocked または ! blocked。
% ! blockedの中で1つがmove, それ以外は!move。

% Test
:- move(D,P,T), blocked(D-1,P,T).              % Dについて:同じペグへの移動はない
:- move(D,T), on(D,P,T-1), blocked(D,P,T).     % 実際にそこにいて、次状態でblockされているものは次状態で動けない
% :- move(D,T), blocked(D,P,T).   %% on/3の定義よりDが動けるペグにいても次状態での移動を禁止してしまう → UNSAT

:- goal_on(D,P), not on(D,P,M), moves(M).
:- { on(D,P,T) } != 1, disk(D), moves(M), T = 1..M.

% Display
#show move/3.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.