Pregunta

Con SWI Prolog, no es un predicado que encuentra el número de ítems en una lista llamada NTH1. Quiero poner en práctica mi propia versión del predicado, pero SWI de es tan complicado si nos fijamos en el listado de código (NTH1). ¿Hay una manera más sencilla de hacerlo?

Gracias:)

.
¿Fue útil?

Solución

El código SWI es un poco compleja porque el predicado se puede utilizar para generar a partir de un índice variable:

?- nth1(Idx,[a,b,c],X).
Idx = 1,
X = a ;
Idx = 2,
X = b ;
Idx = 3,
X = c ;
false.

Si no desea que el comportamiento, nth1/3 se puede implementar fácilmente en términos de nth0:

nth1(Idx,List,X) :-
    Idx0 is Idx-1,
    nth0(Idx0,List,X).

Editar : también es posible prescindir de nth0 en tan sólo unas pocas líneas de código:

nth1(1,[X|_],X) :- !.
nth1(Idx,[_|List],X) :-
    Idx > 1,
    Idx1 is Idx-1,
    nth1(Idx1,List,X).

Otros consejos

Considere el uso de restricciones de dominio finitos para general (reversible) aritmética de enteros:

:- use_module(library(clpfd)).

nth1(1, [E|_], E).
nth1(N, [_|Xs], E) :-
        N #> 1,
        N #= N1 + 1,
        nth1(N1, Xs, E).

Yo no tenía intención de ser contradictorias o conseguir a alguien más para hacer mi trabajo en realidad; Sólo quería un consejo, lo siento por no ser más clara.

He implementado por mí mismo ahora, pero podría ustedes posiblemente sugerir mejoras o mejores maneras de hacerlo? Lo que a menudo me encuentro haciendo en Prolog está escribiendo un predicado con el ejemplo de un mostrador o conjunto de contadores y conseguir un predicado con menos argumentos para llamar a las cláusulas con argumentos adicionales. Esto a menudo termina produciendo un poco de código. De todos modos, aquí está mi aplicación que acabo de hacer:

item_at( N, L, Item ) :-
    item_at( N, 0, L, Item ).   
item_at( N, Count, [H|_], Item ) :-
    CountNew is Count + 1,
    CountNew = N,
    Item = H.
item_at( N, Count, [_|T], Item ) :-
    CountNew is Count + 1,
    item_at( N, CountNew, T, Item ).

Cualquier comentario? Gracias :). Uso:

?- item_at(3,[a,b,c,d,e],Item).
Item = c ;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top