我刚刚开始我的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] |
.
.
.
我无法做到这一点。任何帮助表示赞赏。
答案 0 :(得分:0)
假设给定的member
函数有效,那么您可以像这样使用它:
same(X,Y) :- linea(_,L), member(X,L), member(Y,L), !.
如果有一些行(我们不关心哪一个,因此“不关心”占位符_
)有一个站列表,那说X和Y在同一行上L
,X
和Y
都是L
的成员。
剪切操作符!
表示,一旦解释器找到任何这样的行,它就可以停止寻找更多;我们所关心的只是布尔结果。