Pregunta

Yo entiendo que tiene que averiguar mi propia tarea, pero al ver que nadie en la clase puedo entenderlo, necesito un poco de ayuda.

  

Escribir un programa Prolog tal que p(X)   es cierto si X es una lista que consiste en n   a es seguido por n+1 de b, para cualquier n >= 1.

¿Fue útil?

Solución

Se debe utilizar un contador para realizar un seguimiento de lo que ha encontrado hasta el momento. Cuando encuentre un b, agrega uno al contador. Cuando encuentre un a, resta uno. El coste final de su contador después de toda la lista es atravesada debe ser uno, ya que desea que el número de b es ser 1 más que el número de a de. Aquí está un ejemplo de cómo escribir código que, en:

% When we see an "a" at the head of a list, we decrement the counter.
validList([a|Tail], Counter) :-
  NewCounter is Counter - 1,
  validList(Tail, NewCounter).

% When we see an "b" at the head of a list, we increment the counter.
validList([b|Tail], Counter) :-
  NewCounter is Counter + 1,
  validList(Tail, NewCounter).

% When we have been through the whole list, the counter should be 1.
validList([], 1).

% Shortcut for calling the function with a single parameter.
p(X) :-
  validList(X, 0).

Ahora, esto va a hacer casi lo que quiere - que coincide con las reglas para todos n >= 0, mientras que usted lo quiere para todos n >= 1. De manera típica respuesta tarea, he dejado que el último bit que le permite añadir a sí mismo.

Otros consejos

No recuerdo cómo este código en Prolog, pero la idea es la siguiente:

Regla 1: Si listsize es 1, devolverá true si el elemento es un B.

Regla 2: Si listsize es 2, el retorno falsa.

Regla 3: Compruebe si el primer elemento de la lista es una A y la última es una B. Si esto es cierto, volver la solución para los elementos 2 a listsize-1.

Si he entendido correctamente que el problema debe ser la solución perfecta de estilo Prolog.

Edit: Estoy totalmente olvidó de esto. He editado la respuesta a considerar el caso de n = 1 yn = 2. Gracias a Heath Hunnicutt.

Aquí está mi solución abstrusa

:-use_module(library(clpfd)).

n(L, N) -->
    [L],
    {N1 #= N-1
    },
    !, n(L, N1).
n(_, 0) --> [], !.

ab -->
    n(a, N),
    {N1 is N + 1
    },
    n(b, N1).

p(X) :- phrase(ab, X).

test :-
    p([b]),
    p([a,b,b]),
    p([a,a,b,b,b]),
    p([a,a,a,b,b,b,b]),
    \+ p([a]),
    \+ p([a,b]),
    \+ p([a,a,b,b]),
    \+ p([a,b,b,c]).

Prueba:

 ?- [ab].
% ab compiled 0.00 sec, -36 bytes
true.

 ?- test.
true.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top