Encuentre todas las posibles combinaciones de listas de bases de datos en Prolog.
Tengo la siguiente base de datos para mi programa:
letter([a,b,c,d,e,f]).
number([1,2,3,4,5,6]).
Quiero crear un predicado combinations/1 que devuelva lo siguiente como entrada y salida:
?- combinations(List).
List = [set(a, 6), set(b, 5), set(c, 4), set(d, 3), set(e, 2), set(f, 1)];
List = ...
Luego, cuando use el punto y coma (;), me dará una nueva combinación.
Este es mi mejor intento, pero me devuelve una lista grande en lugar de pequeñas en las que puedo retroceder:
combinations(List) :-
findall((X,Y), (member(X, letter(L1), member(Y, number(L2)), List))).
davy.ai
Para obtener la salida deseada, necesitamos generar todas las combinaciones posibles de los elementos de las listas
letter
ynumber
. Una manera de hacer esto es utilizando los predicadosfindall/3
ysetof/3
.Aquí tienes una posible implementación del predicado
combinations/1
:Analizémoslo:
letter(L)
ynumber(N)
se utilizan para acceder a las listasletter
ynumber
, respectivamente.nth0(I, L, X)
ynth0(I, N, Y)
se utilizan para seleccionar un elemento de cada una de las listas basándose en su índiceI
. Utilizamos el mismo índiceI
para ambas listas para asegurarnos de obtener combinaciones de un elemento de cada lista.(set(X, Y), ...)
crea un par de un elemento de la listaletter
y un elemento de la listanumber
como un set.setof/3
recopila todos los sets únicos que se pueden generar a partir de los pares de listas, y devuelve el resultado en orden ascendente.Utilizando el predicado
setof/3
nos aseguramos de obtener solo combinaciones únicas en nuestra lista de salida. Si deseas generar todas las combinaciones (incluyendo duplicados), puedes utilizarfindall/3
en su lugar:Esta implementación generará todas las combinaciones posibles de los elementos de las listas
letter
ynumber
, incluyendo duplicados si los hay.Para utilizar la retrotracción y generar nuevas combinaciones en cada punto y coma (;), simplemente llama al predicado
combinations/1
:Cada vez que presiones
;
, el intérprete retrocederá y generará una nueva combinación a partir decombinations/1
.