我想将ligacao
和cidade
参数插入包含过孔的列表中。
我的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).
有效。我不明白为什么它以这种方式工作而另一方面却没有。