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.

Cómo programar una lista en Prolog que tenga n cantidad de elementos.

Estoy tratando de codificar un programa en prolog que retorna verdadero solo si la lista contiene solo las letras {a, b, c} en primer lugar y debe tener la misma cantidad exacta de a, b y c. Además, debe estar en este orden [a, b, c].
Ejemplo: [] es verdadero, [a, a, b, b, c, c] es verdadero y [a, a, a, b, b, b, c, c, c] también es verdadero, pero [b, b, c, c, a, a] es falso, [b] es falso, [a, b] es falso, [a, c] es falso y [a, a, b, b, b, c, c, c] también es falso.

Aquí está lo que intenté hacer, pero el problema es que en cada iteración, la primera c no se coloca al final:

langage11([]).

langage11(L) :-
langage11(L, []).

langage11([a, b, c | A], A).

langage11([a|A], B) :-
langage11(A, C),
C = [b, c|B].

Espero que alguien pueda ayudarme.

Tags:  

Answer

  1. Avatar for davy.ai

    Para resolver este problema, necesitamos verificar las siguientes condiciones:

    • la lista debe contener únicamente las letras {a, b, c}
    • la lista debe tener la misma cantidad exacta de a’s, b’s y c’s
    • las letras deben estar en el orden [a, b, c]

    Aquí hay una posible solución utilizando Prolog:

    langage11(L) :-
        % verificar que L solo contenga a, b o c
        forall(member(X, L), member(X, [a, b, c])),
        % contar la cantidad de a's, b's y c's
        count(a, L, CountA),
        count(b, L, CountB),
        count(c, L, CountC),
        % verificar que tengan la misma cantidad
        CountA =:= CountB,
        CountB =:= CountC,
        % verificar que a, b y c aparezcan en el orden correcto
        append(ABC, Rest, L),
        append(AB, [c|C], ABC),
        length(AB, CountA),
        length(C, CountC),
        % asegurarse de que el resto de la lista esté vacío
        Rest = [].
    
    % contar la cantidad de apariciones de X en L
    count(X, L, N) :-
        include(==(X), L, Xs),
        length(Xs, N).
    

    Esta solución primero verifica que cada elemento de la lista sea a, b o c utilizando el predicado forall. Luego cuenta la cantidad de a’s, b’s y c’s utilizando el predicado count. Verifica que tengan la misma cantidad utilizando el operador =:=. Luego utiliza el predicado append para dividir la lista en el prefijo [a, b, c] y el resto de la lista. El predicado length se utiliza para asegurarse de que el prefijo tenga la cantidad correcta de a’s y c’s. Finalmente, verifica que el resto de la lista esté vacío.

    Aquí hay algunos ejemplos:

    ?- langage11([]).
    true .
    
    ?- langage11([a,a,b,b,c,c]).
    true .
    
    ?- langage11([a,a,a,b,b,b,c,c,c]).
    true .
    
    ?- langage11([b,b,c,c,a,a]).
    false.
    
    ?- langage11([b]).
    false.
    
    ?- langage11([a,b]).
    false.
    
    ?- langage11([a,c]).
    false.
    
    ?- langage11([a,a,b,b,b,c,c,c]).
    false.
    

    ¡Espero que esto ayude!

Comments are closed.