Prolog中的列表结构

时间:2016-02-28 01:05:55

标签: prolog

我刚刚开始我的Prolog课程,而且我很难理解我的最新练习。我应该修改我老师给我们的一些代码,以便回答有关墨西哥城地铁的某些问题。这是代码:

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,niños_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,
     peñon_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]).

% Utilidades

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

对于列表,第一个元素(数字)是地铁线路号,第二个元素(子列表)是每条线路上的站点。我只是不知道如何解释列表,或者为什么将它们说成事实,或者为什么他会将行号添加为列表的成员而不是将其放在名称中。

如果有人能向我解释我如何使用成员陈述查询序言并获得真/假答案,我会非常感激。

编辑: 我设法使用成员(atlalilco,L)使其工作,但它只是提供以下内容:

L = [atlalilco|_G396] :-;
L = [_G395, atlalilco|_G399] |;
L = [_G395, _G398, atlalilco|_G402] |;
L = [_G395, _G398, _G401, atlalilco|_G405] |;
L = [_G395, _G398, _G401, _G404, atlalilco|_G408] |
.
.
.

我无法做到这一点。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

假设给定的member函数有效,那么您可以像这样使用它:

same(X,Y) :- linea(_,L), member(X,L), member(Y,L), !.

如果有一些行(我们不关心哪一个,因此“不关心”占位符_)有一个站列表,那说X和Y在同一行上LXY都是L的成员。

剪切操作符!表示,一旦解释器找到任何这样的行,它就可以停止寻找更多;我们所关心的只是布尔结果。