Frage

Mit SWI Prolog gibt es ein Prädikat, das das n-te Element in einer Liste findet genannt Nth1. Ich möchte meine eigene Version des Prädikats implementieren, aber SWI ist so kompliziert, wenn man sich die Auflistung (Nth1) Code aussehen. Gibt es einen einfacheren Weg, es zu tun?

Danke:)

.
War es hilfreich?

Lösung

Der SWI-Code ist ein wenig kompliziert, weil das Prädikat verwendet werden kann, aus einem variablen Index zu generieren:

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

Wenn Sie dieses Verhalten nicht wünschen, kann nth1/3 leicht in Bezug auf nth0 umgesetzt werden:

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

Bearbeiten : Es ist auch möglich, ohne nth0 zu tun in nur wenigen Codezeilen:

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

Andere Tipps

Betrachten endliche Bereich Einschränkungen für allgemeine Verwendung (reversible) Ganzzahl-Arithmetik:

:- use_module(library(clpfd)).

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

Ich wollte es nicht widersprüchlich sein oder jemand bekommen sonst eigentlich meine Arbeit zu tun; Ich wollte nur ein paar Ratschläge, sorry für nicht klarer sein.

Ich habe es selbst jetzt umgesetzt, können aber ihr möglicherweise Verbesserungen vorschlagen oder bessere Möglichkeiten, es zu tun? Was ich finde ich oft in Prolog tut, ist ein Prädikat, mit etwa dem Schreiben einen Zählers oder Satz von Zählern und ein Prädikat mit weniger Argumenten bekommt die Klauseln mit zusätzlichen Argumenten zu nennen. Dies endet oft ziemlich viel Code produziert werden. Wie auch immer, hier ist meine Implementierung ich gerade tat:

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 ).

Fragen oder Anregungen? Vielen Dank :). Verbrauch:

?- item_at(3,[a,b,c,d,e],Item).
Item = c ;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top