es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Necesitas ayuda programando una lista en Prolog?

Necesito ayuda para codificar un programa en Prolog que retorne true si una lista tiene n cantidad de [a, c] y m cantidad de b. Pero debe ser en ese orden: a,b,c si las letras a,b,c están en la lista. En la lista, la cantidad de a y c debe ser la misma, y la cantidad de b puede ser cualquiera. Ejemplo: [] es true, [b] es true, [a,b,c] es true, [a,c] es true, [a,b,b,b,b,c] es true, [a,a,b,c,c] es true. Pero [b,c] es false, [a,b] es false, [a,a,b,c] es false.

Aquí está lo que intenté hacer. Tengo n cantidad de a y m cantidad de b, pero solo necesito que la lista termine con n cantidad de c (misma cantidad que a):

langageAB([b]).

langageAB([b | S]):-
    langageAB(S).

langage8([]).

langage8([a,b]).

langage8([a | S]):-
    langage8(S).

langage8([a |S]):-
    langageAB(S).
Tags:  

Answer

  1. Avatar for davy.ai

    Para resolver el problema, necesitamos llevar un registro del número de “a” y “b” en la lista, asegurándonos de que aparecen en el orden correcto. Podemos hacer esto utilizando dos predicados auxiliares: uno para contar el número de “a” y “c”, y el otro para contar el número de “b”. Luego podemos combinarlos para verificar si la lista cumple con las condiciones deseadas.

    Aquí está el código para los dos predicados auxiliares:

    % contar el número de "a" y "c" en la lista
    num_a_c([], 0).
    num_a_c([a|T], N) :- num_a_c_helper(T, 1, N).
    num_a_c([c|T], N) :- num_a_c_helper(T, -1, N).
    num_a_c([H|T], N) :- dif(H,a), dif(H,c), num_a_c(T, N).
    
    num_a_c_helper([], N, N).
    num_a_c_helper([a|T], C, N) :- C1 is C + 1, num_a_c_helper(T, C1, N).
    num_a_c_helper([c|T], C, N) :- C1 is C - 1, num_a_c_helper(T, C1, N).
    num_a_c_helper([H|T], C, N) :- dif(H,a), dif(H,c), num_a_c_helper(T, C, N).
    
    % contar el número de "b" en la lista
    num_b([], 0).
    num_b([b|T], N) :- num_b(T, N1), N is N1 + 1.
    num_b([H|T], N) :- dif(H,b), num_b(T, N).
    

    Ahora podemos usar estos predicados para verificar si la lista cumple con las condiciones deseadas:

    % verificar si la lista tiene n "a" y m "b" seguidos de n "c" (en ese orden)
    lenguaje([], _).
    lenguaje([a|T], N) :- num_a_c(T, N1), N1 =:= N, num_b(T, M), lenguaje_aux(T, M, N).
    lenguaje([H|T], N) :- dif(H,a), lenguaje(T, N).
    
    % predicado auxiliar para contar el número de "b" y verificar "c"
    lenguaje_aux([], 0, 0).
    lenguaje_aux([b|T], M, N) :- M1 is M - 1, lenguaje_aux(T, M1, N).
    lenguaje_aux([c|T], M, N) :- N1 is N - 1, lenguaje_aux(T, M, N1).
    lenguaje_aux([H|T], M, N) :- dif(H,b), dif(H,c), lenguaje_aux(T, M, N).
    

    Para usar el predicado lenguaje/2, simplemente llámalo con una lista y el número deseado de “a” y “c”:

    ?- lenguaje([], 0).
    true.
    
    ?- lenguaje([b], 0).
    true.
    
    ?- lenguaje([a,b,c], 1).
    true.
    
    ?- lenguaje([a,c], 1).
    true.
    
    ?- lenguaje([a,b,b,b,b,c], 3).
    true.
    
    ?- lenguaje([a,a,b,c,c], 2).
    true.
    
    ?- lenguaje([b,c], 0).
    false.
    
    ?- lenguaje([a,b], 1).
    false.
    
    ?- lenguaje([a,a,b,c], 2).
    false.
    

    ¡Espero que esto ayude!

Comments are closed.