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 codificar un programa en Prolog basado en esto

Estoy tratando de codificar un programa en prolog que solo utiliza las letras {a, b, c} y toma una cantidad “l” de a, una cantidad “m” de b y una cantidad “n” de c. Pero tiene que ser en el orden a, b, c. Ejemplo: [a, b, c] es verdadero, [a, a, b, b, c] es verdadero, [a, b] es verdadero, [a] es verdadero, [b] es verdadero, [c] es verdadero, [a, c] es verdadero, [b, c] es verdadero, [a, a, a, b, b] es verdadero. Pero [b, a, c] es falso, [c, b] también es falso y lo mismo ocurre con [b, b, b, c, c, c, a]. Debido a que el orden es incorrecto.

Esto es lo que intenté hacer, pero no hace exactamente lo que quiero:

langageAB([b]).

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

langageAC([c]).

langageAC([c | S]):-
    langageAC(S).

langage7([a, b, c]).

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

langage7([a |S]):-
    langageAB(S).

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

langage7([b | S]):-
    langageAC(S).
Tags:  

Answer

  1. Avatar for davy.ai

    Para resolver el problema tal como se describe, podemos modificar el código de la siguiente manera:

    langage([]). % se permite una lista vacía
    
    langage([a | S]):- % si el elemento actual es a,
        langage(S), % asegurar que la lista restante es válida,
        \+ member(a,S). % y a no se repite
    
    langage([b | S]):- % si el elemento actual es b,
        langage(S), % asegurar que la lista restante es válida,
        count(b,[b | S],Count_b), % contar la cantidad de b's en la lista hasta ahora
        \+ member(b,S), % b no se repite
        Count_b > 0, % debe haber al menos 1 b en la lista
    
    langage([c | S]):- % si el elemento actual es c,
        langage(S), % asegurar que la lista restante es válida,
        count(b,[b | S],Count_b), % contar la cantidad de b's en la lista hasta ahora
        count(c,[c | S],Count_c), % contar la cantidad de c's en la lista hasta ahora
        Count_b = Count_c, % la cantidad de b's y c's debe ser la misma
        \+ member(c,S). % c no se repite
    
    count(Item, List, Count):- % predicado auxiliar para contar las ocurrencias de un elemento dado en una lista
        include(=(Item), List, ItemList),
        length(ItemList, Count).
    

    Este código utiliza recursión para verificar si la lista restante es válida, e incluye comprobaciones adicionales para el orden y la cantidad de elementos. El predicado auxiliar count/3 cuenta las ocurrencias de un elemento dado en una lista.

    Con este código, los ejemplos proporcionados en la pregunta se evaluarán correctamente. Por ejemplo:

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

    Ten en cuenta que esta implementación solo funciona para el caso específico de a, b, c en ese orden. Si el orden requerido de los elementos cambia, el código deberá modificarse en consecuencia.

Comments are closed.