2012-10-10 37 views

Respuesta

3

ACTUALIZACIÓN: Ya que no está permitido el uso de otros predicados, intente esto:

firstlast([H,H]). 
firstlast([F,_|T]) :- firstlast([F|T]). 

La primera trata predicado con el caso base, el segundo elimina el segundo elemento de una lista de tres o más artículos, y recursivas hacia abajo.

+0

'Xs = [f, Xs], firstlast (Xs) .' tiene éxito. ¿Esto es intencionado? – false

+0

@false Acabo de probar esto en SWI, y recibí 'falso' de vuelta, ¿me estoy perdiendo algo? (nota: edité mi respuesta, había un error tipográfico en la primera línea - decía 'last (X, list)' en vez de 'last (X, List)') – dasblinkenlight

+0

'first (H, H) .' debe estar remoto. – false

2

Probablemente quiera decir que el primer y el último elemento son iguales. Aquí es una solución utilizando -notation:

 
firstlast(Xs) :- 
    phrase(([X],...,[X]), Xs). 

... --> [] | [_], ... . 

No estoy seguro de si firstlast([1]) debe tener éxito o no ...

0

Bueno, ya que sólo se puede utilizar una recursión con firstlast/1 la solución se parecerá :

firstlast(...) :- ... . 
firstlast(...) :- ... . 
firstlast(...) :- ... . 
.... 
firstlast(...) :- ... . 

algunos de esos serán las normas relativas al caso base y algunos de ellos las reglas que "desgasten" el problema. este problema requiere una comprobación: compare el primero y el último elemento. entonces, en tu caso base solo deberías tener estos 2 elementos; no necesitas nada más por lo que la solución va a ignorar todos los demás elementos

última pista: se puede acceder a los 2 primeros elementos de una lista con el siguiente patrón de unificación:

foo([H1,H2|T]) 
0

Así que justo tengo esto:

firstlast([H,_|T]) :- 
(T1 = H, T1 = T) -> firstlast([H|T]). 

Mi código compara el último elemento y el primero pero la recursión es incorrecta:/

Como se explicó anteriormente, no se debe permitir que tenga éxito con un elemento de la lista. Aunque solo se me permite usar el predicado "firstlast".

+2

Este código sería mucho más visible si lo agregaras a la pregunta en sí, en lugar de publicarlo como respuesta. Siempre puede editar su pregunta haciendo clic en el enlace 'edit'. – dasblinkenlight

Cuestiones relacionadas