Prolog中的列表结构

Prolog中的列表结构,prolog,Prolog,我刚刚开始我的序言课程,我很难理解我的最新实践。我应该修改老师给我们的一些代码,这样它就可以回答一些关于墨西哥城地铁的问题。代码如下: linea(1,[observatorio,tacubaya,juanacatlan,chapultepec,sevilla,cuahtemoc, balderas,salto_del_agua,isabel_la_catolica,pino_suarez,merced, candelaria,san_lazaro,moctezuma,bal

我刚刚开始我的序言课程,我很难理解我的最新实践。我应该修改老师给我们的一些代码,这样它就可以回答一些关于墨西哥城地铁的问题。代码如下:

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).
对于列表,第一个元素(编号)是地铁线路编号,第二个元素(子列表)是每条线路上的车站。我只是不知道如何解释这些列表,或者为什么这些列表被作为事实陈述,或者为什么他会添加行号作为列表的一个成员,而不是将其放在名称中

如果有人能向我解释如何使用成员语句查询prolog并得到正确/错误的答案,我将非常感谢

编辑: 我设法使用member(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] |
.
.
.

我对这一切一无所知。非常感谢您的帮助。

假设给定的
成员
功能正常工作,您可以这样使用它:

same(X,Y) :- linea(_,L), member(X,L), member(Y,L), !.
也就是说,如果有一行(我们不在乎是哪一行,因此“不在乎”占位符
\uuu
)有一个站点列表
L
,那么X和Y都在同一行上,这样
X
Y
都是
L
的成员


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

我不知道你对什么感到困惑;也许试着澄清一下你的问题?我假设谓词
linea(N,ListOfStations)。
表示line
N
包含所提供列表中的站点。你被要求做什么修改?例如,我必须写一个相同的(X,Y)语句,表示如果两个站在同一条线上。你是对的,我问的不太清楚。很抱歉。我将编辑原始帖子。为了回答您关于使用成员的问题(atlalilco,L):-第一个回答[atlalilco | Rest]说atlalilco是列表的一个成员,其中atlalilco是列表的第一个元素,包含以下内容(Rest);这确实是真的-第二个回答说atlalilco是列表的一个成员,其中atlalilco是列表的第二个元素,任何东西都是第一个成员,任何东西都是后面的,依此类推!很合乎逻辑,你不觉得吗?