このディレクトリの索引

九九表([
[1,2,3,3,4,6,7,8,9],
[2,4,6,8,10,12,14,16,18],
[3,6,9,12,15,18,21,24,27],
[4,8,12,16,20,24,28,32,36],
[5,10,15,20,25,30,35,40,45],
[6,12,18,24,30,36,42,48,54],
[7,14,21,28,35,42,49,56,63],
[8,16,24,32,40,48,56,64,72],
[9,18,27,36,45,54,63,72,81]]).


'「21÷7 の計算は、九九表をどのように辿れば答えがえられますか?」ならば全然問題がないように思いますが。'(_答え,_答えは何段目にある) :-
        九九表を得る(_九九表),
        '7を段から辿るか、列から辿るかを決める'(_段経由または列経由),
        九九表から7段目または7列目を取り出す(_段経由または列経由,_九九表,_取り出した段または列),
        '7段目または7列目経由で21を探しその要素位置が答えである'(_段経由または列経由,_取り出した段または列,_答え,_答えは何段目にある).

九九表を得る(_九九表) :-
        九九表(_九九表).

'7を段から辿るか、列から辿るかを決める'(段経由) :-
        0 is random(7717) mod 2,!.
'7を段から辿るか、列から辿るかを決める'(列経由).

九九表から7段目または7列目を取り出す(段経由,_九九表,_取り出した段または列) :-
        nth1(7,_九九表,_取り出した段または列).
九九表から7段目または7列目を取り出す(列経由,_九九表,_取り出した段または列) :-
        転置(_九九表,_転置した九九表),
        nth1(7,_転置した九九表,_取り出した段または列).

'7段目または7列目経由で21を探しその要素位置が答えである'(段経由,_取り出した段または列,_答え,7) :-
        nth1(_答え,_取り出した段または列,21).
'7段目または7列目経由で21を探しその要素位置が答えである'(列経由,_取り出した段または列,_答え,_何段目) :-
        nth1(_何段目,_取り出した段または列,21),
        _答え = _何段目.

転置([],[],[]) :- !.
転置([[A|R1]|R2],[R1|R3],[A|R4]) :-
        転置(R2,R3,R4).

転置([[]|_],[]) :- !.
転置(L,[L1|R2]) :-
        転置(L,L2,L1),
        転置(L2,R2).