2 votes

Comment appeler correctement des éléments de liste entre parenthèses dans Prolog

Je vous prie d'agréer, Monsieur, l'expression de mes salutations distinguées :

linea(1,[observatorio,tacubaya,juanacatlan,chapultepec,sevilla,cuahtemoc,
     balderas,salto_del_agua,isabel_la_catolica,pino_suarez,merced,
     candelaria,san_lazaro,moctezuma,balbuena,bulevard_puerto_aereo,
     gomez_farias,zaragoza,pantitlan]).

linea(2,[cuatro_caminos,panteones,tacuba,cuitlahuac,popotla,colegio_militar,
     normal,san_cosme,revolucion,hidalgo,bellas_artes,allende,zocalo,
     pino_suarez,san_antonio_abad,chabacano,viaducto,xola,villa_de_cortes,
     nativitas,portales,ermita,general_anaya,tasquena]).

linea(3,[indios_verdes,deportivo_18_de_marzo,potrero,la_raza,tlatelolco,
     guerrero,hidalgo,juarez,balderas,nignos_heroes,hospital_general,
     centro_medico,etiopia,eugenia,division_del_norte,zapata,coyoacan,
     viveros,miguel_angel_de_quevedo,copilco,universidad]).

linea(4,[martin_carrera,talisman,bondojito,consulado,canal_del_norte,
     morelos,candelaria,fray_servando,jamaica,santa_anita]).

linea(5,[politecnico,instituto_del_petroleo,autobuses_norte,la_raza,misterios,
     valle_gomez,consulado,eduardo_molina,aragon,oceania,terminal_aerea,
     hangares,pantitlan]).

linea(6,[el_rosario,tezozomoc,azcapotzalco,ferreria,norte_45,vallejo,
     instituto_del_petroleo,lindavista,deportivo_18_de_marzo,basilica,
     martin_carrera]).

linea(7,[el_rosario,aquiles_serdan,camarones,refineria,tacuba,
     rio_san_joaquin,polanco,auditorio,constituyentes,tacubaya,
     san_pedro_de_los_pinos,san_antonio,mixcoac,barranca_del_muerto]).

linea(8,[garibaldi,bellas_artes,san_juan_de_letran,salto_del_agua,
     doctores,obrera,chabacano,la_viga,santa_anita,coyuya,iztacalco,
     apatlaco,aculco,escuadron_201,atlalilco,iztapalapa,
     cerro_de_la_estrella,uami,constitucion_de_1917]).

linea(9,[tacubaya,patriotismo,chilpancingo,centro_medico,lazaro_cardenas,
     chabacano,jamaica,mixihuca,velodromo,ciudad_deportiva,puebla,
     pantitlan]).

linea(a,[pantitlan, agricola_oriental,canal_de_san_juan,tepalcates,guelatao,
     pegnon_viejo,acatitla,santa_marta,los_reyes,la_paz]).

linea(b,[ciudad_azteca,plaza_aragon,olimpica,ecatepec,muzquiz,
     rio_de_los_remedios,impulsora,nezahualcoyotl,villa_de_aragon,
     bosque_de_aragon,deportivo_oceania,oceania,romero_rubio,
     r_flores_magon,san_lazaro,morelos,tepito,lagunilla,garibaldi,
     guerrero,buenavista]).

linea(12,[mixcoac,insurgentes_sur,hospital_20_de_noviembre,zapata,
      parque_de_los_venados,eje_central,ermita,mexicaltzingo,
      atlalico,culhuacan,san_andres_tomatlan,lomas_estrella,calle_11,
      periferico_oriente,tezonco,olivos,nopalera,zapotitlan,
      tlaltenco,tlahuac]).

... et les fonctions suivantes :

member(X,[X|Xs]).
member(X,[Y|Xs]):-member(X,Xs).

append([],X,X).
append([X|Xs],Ys,[X|Zs]):-append(Xs,Ys,Zs).

Ce que j'essaie de faire, c'est de vérifier, par exemple, si l'élément 'mixcoac' appartient au tableau de linea(12) qui est quelque chose comme le 2ème élément, mais je ne sais pas comment travailler ce genre de listes dans la syntaxe Prolog.

J'ai essayé d'exécuter member(mixcoac, 12). mais cela ne fonctionne pas.

1voto

TA_intern Points 1360

Comme ceci :

?- linea(12, L), member(mixcoac, L).
L = [mixcoac, insurgentes_sur, hospital_20_de_noviembre, zapata, parque_de_los_venados, eje_central, ermita, mexicaltzingo, atlalico|...] ;
false.

Cette requête réussit une fois et échoue en cas de retour en arrière. Cela signifie que l'élément mixcoac n'apparaît qu'une seule fois dans la liste des linea(12, L) .


La liste que je montre ci-dessus est spécifique à SWI-Prolog, et au fait que nous utilisons le toplevel (l'interpréteur de commandes interactif), et la façon dont il est configuré par défaut. Cela signifie que d'autres Prologs auront un aspect différent, et qu'exécuter le code différemment aura un aspect différent. Par exemple, vous pouvez utiliser des "variables anonymes", commençant par un trait de soulignement, pour la liste ; et vous pouvez configurer le toplevel de SWI-Prolog pour ne pas montrer les liaisons pour les variables anonymes. Avec rien d'autre à montrer vous obtiendrez votre "vrai" :

?- set_prolog_flag(toplevel_print_anon, false).
true.

?- linea(12, _L), member(mixcoac, _L).
true .

J'ai également tapé Enter au lieu de ; après le "true". De cette façon, je n'ai pas demandé d'autres solutions et je n'ai pas obtenu de "faux", c'est-à-dire "il n'y a plus de solutions".

Tout cela n'a rien à voir avec votre question initiale.

D'autre part, d'après votre question :

mais je ne sais pas comment utiliser ce type de listes dans la syntaxe Prolog.

Cela n'a rien à voir avec la syntaxe. Un didacticiel générique aurait dû vous apprendre tout ce que vous avez besoin de savoir.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X