編集:より簡単:
コードを単純化するために変更しました。述語「nbarret」は、必要なステーションの数を返します。
だから私の新しいコードがありますが、それは何も変更しません:
nb_stations([],0).
nb_stations([S,Li,Dir,SS],X):-nbarret(Li,S,SS,Dir,Y),X is X1 + Y.
nb_stations([S,Li,Dir,SS|Tr],X):-
nbarret(Li,S,SS,Dir,Y),nb_stations([SS|Tr],X is X1 + Y).
この場合、エラーがあります:
ERROR: is/2: Arguments are not sufficiently instantiated
Exception: (8) (_G2031 is _G2270+1)is _G2711+5 ? creep
Exception: (7) nb_stations([charles_de_gaulle_etoile, m6, nation, bir_hakeim], _G2031 is _G2270+1) ? creep
Exception: (6) nb_stations([la_defense, rerA, vincennes, charles_de_gaulle_etoile, m6, nation, bir_hakeim], _G2031) ? creep
/---------------------------------------------------------------- ------------/
古いコード(非推奨、理解のために保持):
nb_stations([S,Li,Dir,SS|Tr],X):-num_stations(S,Li,Dir1,ND,_,_),Dir=Dir1,!,
num_stations(SS,Li,Dir1,NA,_,_),Dir=Dir1,!,
calculer(ND,NA,Y),X is X1 + Y,nb_stations([SS|Tr],X).
nb_stations([S,Li,Dir,SS|Tr],X):-num_stations(S,Li,_,_,Dir2,ND),!,
num_stations(SS,Li,_,_,Dir2,NA),!,
Dir=Dir2,!,calculer(ND,NA,Y),X is X1 + Y,nb_stations([SS|Tr],X).
calculer(ND,NA,X):-X is ND - NA.
詳細:
nb_stations を呼び出すときは、出発駅、交通機関の路線、方向、そして停車する駅を含むリスト内のパスを通知する必要があります。次が多ければ対応になります。この例では: nb_stations([la_defense,rerA,vincennes,charles_de_gaulle_etoile,m6,nation,bir_hakeim],X).
la_defense で開始し、"rerA" トランスポートを利用し、方向に "vincennes" を利用します。その後、「charles_de_gaulle_etoile」で停車し、m6 (地下鉄) に乗り、「nation」方面に向かい、「bir_hakeim」に到着します。したがって、私のコードは、この旅行で通過する駅の数を数えます。