Credo di avere trovato una soluzione (di sicuro non una particolarmente elegante).
Ho fatto un po' di tests, ma bisognerebbe farne di più per essere sicuri che funzioni per tutte le combinazioni "dispositivi-stati".
La funzione riceve in input un vettore che definisce il numero di stati di ogni dispositivo (nel caso della tua domanda, l'input è il vettore [2 3]).
Il numero di dispositivi viene identificato in base alla lunghezza del vettore in input (in questo caso, 2).
La soluzione si basa sulla creazione delle tabelle di verità base per ogni dispositivo usando la funzione
eye.
Scorrendo la lista dei dispositivi dall'ultimo al primo (nel caso della tua domanda partendo da quello con 3 stati per passare poi a quello con 2 stati), viene prima replicata la tabella di verità dell'ultimo dispositivo per la combinazione delle tabelle di verità dei rimanenti dispositivi.
Dal penultimo in poi (sempre scorrendo la lista a ritroso) vengono replicate le singole righe delle varia tabelle di verità per il numero di combinazioni ottenibili dagli stati dei dispositivi che precedono e seguono quello corrente.
MI rendo conto che questa descrizione è un po' "oscura", è un po' complicato descrive in poche parole l'algoritmo.
Nel codice ho inserito dei commenti che, spero, rendano più chiaro il funzionamento della funzione.
function tv=truth_table(n_stat)
%TRUTH_TABLE genera la tabella di verità indicato le possibili combinazioni
%di dispositivi nei loro possibili stati, l'unico vincolo è quello che ogni
%dispositivo può avere solo uno stato attivo alla volta
%
% INPUT: vettore contenente, per ogni dispositivo, il numero di stati
% possibili:
% ESEMPIO: dati due dispsitivi "a" con due stati e "b" con tre stati
% possibili ==> a_0 a_1 b_0 b_1 b_2, l'input deve essere il vettore [2 3]
%
% OUTPUT: la tabella di verità
%
% Identificazione del numero di dispositivi
%
n_disp=length(n_stat);
%
% Inizializzazione contatore numero dispositivi: viene settato al numero
% totale dei dispositivi, ad ogni iterazione viene decrementato, in questo
% modi la lista dei dispositivi viese scorsa "al contrario
%
cnt=n_disp;
%
% Creazione di una copia temporanea del numero di stati
tmp_n_stat=n_stat;
%
% Il numero di stati del dispositivo corrente viene settato a 1 (il numero
% degli stati viene moltiplicato ad ogni iterazione per calcolare il numero
% di replice delle singole tabelle di verità
%
tmp_n_stat(cnt)=1;
%
% Creazione della tabella di verità "base" per il dispositivo corrente
%
tmp_disp=eye(n_stat(end))
%
% Replica della tabella verità dell'ultimo dispositivo
%
tmp_disp=repmat(tmp_disp,prod(tmp_n_stat),1)
%
% Aggiunta della tabella di verità dell'ultimo dispositivo alla matrice di
% output
tv=tmp_disp;
%
% Loop (a ritroso) sui rimanenti dispositivi
%
for i=n_disp-1:-1:1
%
% Decremento del contatore per scorrere i dispositivi "a ritroso"
%
cnt=cnt-1;
%
% Il numero di stati del dispositivo corrente viene posto uguale a 1 (il
% suo valore non deve essere considerato nel calcolo delle combinazioni
%
tmp_n_stat(cnt)=1;
%
% Inizializzazione della tabella di verità per il dispositivo corrente
%
e_r=[];
%
% Creazione della tabella di verità "base" per il dispositivo corrente
%
tmp_disp=eye(n_stat(i))
%
% Replica delle singole righe della tabella di verità "base" per il
% dispositivo corrente per il numero di righe delle tabelle di verità
% dei dispositivi già considerati
%
for j=1:length(tmp_disp)
e_r=[e_r;repmat(tmp_disp(j,:),prod(n_stat(cnt+1:end)),1)]
end
%
% Replica della tabella di verità del dispositivo corrente per il numero
% di righe delle tabelle di verità dei dispositivi ancora da considerare
% (non si applica all'ultimo dispositivo
%
if(i > 1)
e_r=[e_r;repmat(e_r,prod(n_stat(1:cnt-1))-1,1)]
end
%
% Aggiunta della tabella di verità del dispositivo corrente alla tabella
% di output
%
tv=[e_r tv];
end
Hope this helps.