算上序言 - 不可能做到

时间:2012-12-30 22:10:49

标签: prolog

编辑:更简单:

我将代码更改为简化。谓词" 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(地铁),方向是#34;国家",你到了" bir_hakeim"。所以我的代码计算了我在这次旅行中通过的电台数量。

2 个答案:

答案 0 :(得分:1)

分配X时需要更改顺序。

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),
    nb_stations([SS|Tr],X1),
    X is X1 + Y.   % Change here

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),
    nb_stations([SS|Tr],X1),
    X is X1 + Y. % Change here

答案 1 :(得分:0)

你想写什么?

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),
     nb_stations([SS|Tr],X is X1+Y).

可能是

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,  <== here X1 is a free variable

     nb_stations([SS|Tr],X).