Prolog将列表中的值插入另一个列表

时间:2015-05-21 13:55:13

标签: prolog

我想将ligacaocidade参数插入包含过孔的列表中。

我的ligacao和cidade事实是

ligacao(porto,braga,comboio,35,1500,1600,5).

cidade(sevilha,espanha,60,interior).

biarc(X,Y,D,Custo,Hi,Hf) :- ligacao(X,Y,_,D,A,B,Custo),Hi=A,Hf=B.

接下来的功能是

conc([], L, L).
conc([C|R], L, [C|T]) :- conc(R, L, T).

addcond_tem(CA, via(P1,P2,Custo,Reg1,Reg2),CN) :- not(member(via(P1,P2,_,_,_),CA)), not(member(via(P2,P1,_,_,_),CA)), conc(CA,[via(P1,P2,Custo,Reg1,Reg2)],CN).

path_tem(X,Y,C,Horaini,Horafin) :- step_tem(X,Y,[],C,Horaini,Horafin).

step_tem(PC,PD,CA,CT,Hi,Hf) :- biarc(PC,PD,_,Custo,A,B),A>=Hi,B=<Hf, tirar_regioes(PC,PD,Reg1,Reg2),addcond_tem(CA, via(PC,PD,Custo,Reg1,Reg2),CT).
step_tem(PC,PD,CA,CT,Hi,Hf) :- biarc(PC,PN,_,Custo,A,B),A>=Hi,B=<Hf,tirar_regioes(PC,PN,Reg1,Reg2), addcond_tem(CA, via(PC,PN,Custo,Reg1,Reg2),Ci), step_tem(PN,PD,Ci,CT,Hi,Hf).

tirar_regioes(PC,PD,Reg1,Reg2):-cidade(PC,_,_,Reg1),cidade(PD,_,_,Reg2).

但是当我测试时:

?-path_tem(porto,faro,C,600,2000).
false

我似乎无法通过(A,B,C,D,E,F)并且它给了我错误。

如果我只有一个Reg1并且没有使用Reg2进行适当的修改,那么它就会顺利进行。我不能在同一个函数中使用cidade(PC,_,_,_)cidade(PD,_,_,_)吗?

如果我这样做:

addcond_tem(CA, via(P1,P2,Custo,Reg1),CN) :- not(member(via(P1,P2,_,_),CA)), not(member(via(P2,P1,_,_),CA)), conc(CA,[via(P1,P2,Custo,Reg1)],CN).

path_tem(X,Y,C,Horaini,Horafin) :- step_tem(X,Y,[],C,Horaini,Horafin).

step_tem(PC,PD,CA,CT,Hi,Hf) :- biarc(PC,PD,_,Custo,A,B),A>=Hi,B=<Hf, cidade(PC,_,_,Reg1),addcond_tem(CA, via(PC,PD,Custo,Reg1),CT).
step_tem(PC,PD,CA,CT,Hi,Hf) :- biarc(PC,PN,_,Custo,A,B),A>=Hi,B=<Hf,cidade(PC,_,_,Reg1), addcond_tem(CA, via(PC,PN,Custo,Reg1),Ci), step_tem(PN,PD,Ci,CT,Hi,Hf).

有效。我不明白为什么它以这种方式工作而另一方面却没有。

0 个答案:

没有答案