このディレクトリの索引

加算の覆面演算行列([S,E,N,D,M,O,R,E,M,O,N,E,Y],[[0,S,E,N,D],[0,M,O,R,E],[M,O,N,E,Y]]).


加算の覆面算(_覆面ならび) :-
        覆面に数字を当てはめる(_覆面ならび,[1,2,3,4,5,6,7,8,9,0]),
        転置した覆面演算を反転したもの(_覆面ならび,LL),
        加算(0,LL).

加算(_,[]).
加算(O,[L|R]) :-
        append(L0,[S],L2),
        list_sum(L0,S0),
        S is S0 mod 10,
        S2 is S0 // 10,
        加算(S2,R).

覆面に数字を当てはめる([],_).
覆面に数字を当てはめる([_変数|R1],_数字ならび) :-
        変数の場合は数字ならびから一つ数字を選択する(_変数,R1,_数字ならび).
覆面に数字を当てはめる([A|R1],_数字ならび) :-
        既に定数の場合は読み飛ばす(A,R1,_数字ならび).


変数の場合は数字ならびから一つ数字を選択する(_変数,R1,_数字ならび,_残り数字ならび) :-
        var(_変数),
        select(_変数,_数字ならび,_数字残りならび),
        覆面に数字を当てはめる(R1,_残り数字ならび).

既に定数の場合は読み飛ばす(A,R1,_数字ならび) :-
        \+(var(A)),
        覆面に数字を当てはめる(R1,_数字ならび).        


転置した覆面演算を反転したもの(_覆面ならび,LL) :-
        加算の覆面演算行列(_覆面ならび,LL1),
        転置(LL1,LL2),
        reverse(LL2,LL).