Trouver le max dans une liste - Prolog
J'étais juste présenté à Prolog et suis en train d'écrire un prédicat qui recherche la valeur maximale d'une liste d'entiers. J'ai besoin d'en écrire un qui compare depuis le début, et l'autre qui compare de la fin. Jusqu'à présent, j'ai:
max2([],R).
max2([X|Xs], R):- X > R, max2(Xs, X).
max2([X|Xs], R):- X <= R, max2(Xs, R).
Je me rends compte que R n'a pas été initié pourtant, il est donc impossible de faire la comparaison. Ai-je besoin d'3 arguments afin de compléter cette?
X <= R
devrait lireX =< R
- Veuillez également vous reporter à la question connexe: Trouver le minimum d'une liste
InformationsquelleAutor user2796815 | 2013-11-05
Vous devez vous connecter pour publier un commentaire.
autre façon
max2([],R).
première requête:-max2([],R)
matchmax2([],R)
Mais il n'est pas possible de déterminer laR
.Ignorant les devoirs des contraintes sur le démarrage à partir du début ou de la fin, la bonne façon de mettre en œuvre un prédicat qui obtient le numérique maximale est comme suit:
Comme une alternative à BLUEPIXY réponse, SWI-Prolog est un builtin prédicat,
max_list/2
, qui fait la recherche pour vous. Vous pourriez aussi envisager une méthode plus lente, de l'OMI utile de se familiariser avec plus d'objets internes et non-déterminisme (et puis les retours en arrière):rendements
modifier
Remarque vous n'avez pas strictement besoin trois arguments, mais juste pour avoir correctement instancié variables pour effectuer la comparaison. Ensuite, vous pouvez "renverser" le flux de valeurs:
encore une fois, c'est plus lent que les trois arguments boucles, suggéré dans d'autres réponses, parce qu'il va vaincre "queue de récursivité optimisation". Aussi, il ne fonctionne tout simplement trouver un de la maxima:
Voici comment le faire avec les expressions lambda et méta-prédicat
foldl/4
, et, éventuellement, clpfd:Passons à l'exécution de certaines requêtes!
Que si la liste est vide?
Enfin, certaines requêtes montrant les différences entre
numbers_max/2
etfdvars_max/2
:Une approche très simple (qui commence à partir du début) est la suivante:
Comme vous l'avez dit, vous devez avoir les variables instanciées, si vous voulez évaluer une expression arithmétique. Pour résoudre ce problème, vous devez d'abord à l'appel récursif, et vous comparez.
Espère que cela aide!