非決定性の述語 単位行列/2

【出典】https://twitter.com/TakaoOzaki/status/306175708726706177
【要約】述語 単位行列/2 を“うまく”定義する。

単位行列 E_n := [ δ_i,j ]_n×n からの連想として「添字」を用いる実装をすると、双方向性を保つのがめんどくさい
(組み込み述語 var による条件分岐がどうしても必要になる気がする)。

【出典】https://twitter.com/TakaoOzaki/status/306175708726706177
【要約】述語 単位行列/2 を“うまく”定義する。

単位行列 E_n := [ δ_i,j ]_n×n からの連想として「添字」を用いる実装をすると、双方向性を保つのがめんどくさい
(組み込み述語 var による条件分岐がどうしても必要になる気がする)。

  • タグ:
  • タグはありません
mylength([], 0).
mylength([_|T], N) :- mylength(T, N1), N is N1 + 1.
([]).
([0|T]) :- (T).
(N, LL) :- mylength(LL, N), _(N, LL).
_(0, []).
_(N, [[1|RowT]|T]) :-
% number(N), N > 0,
N1 is N - 1, mylength(RowT, N1), !, % important!
(T1, ClmT, T),
(RowT), (ClmT),
_(N1, T1).
([], [], []).
([T|LL1], [H|V], [[H|T]|LL]) :-
(LL1, V, LL).
?- (2, [[1, 0], [0, 1]]).
/*
yes
*/
?- (N, [[1, 0], [0, 1]]).
/*
N = 2 ;
no
*/
% no
?- (2, LL).
/*
LL = [[1, 0], [0, 1]] ;
... ()
*/
% no
?- (N, LL).
/*
N = 0, LL = [] ;
N = 1, LL = [[1, 0], [0, 1]] ;
N = 2, LL = [[1, 0, 0], [0, 1, 0], [0, 0, 1]] ;
N = 3, LL = [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]] ;
... (N)
*/
% N = 0, 1
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX