Prolog 序言将值从一个列表插入另一个列表

Prolog 序言将值从一个列表插入另一个列表,prolog,Prolog,我想将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]) :-

我想将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).
我似乎无法得到viaA,B,C,D,E,F,它给了我错误的答案

如果我只使用一个Reg1,而不使用带有适当修改的Reg2,那么它运行得很好。我不能在同一个函数中同时使用cidadePC、u、u、u和cidadePD、u、u、u吗

如果我这样做:

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).

它起作用了。我不明白为什么它是这样工作的,而另一个不是这样。

你发布这么多代码真是太好了。但是我听不懂这些话,所以我很难理解到底发生了什么。1.你能举个简单的例子吗?2. ?- 路径还是?-路径?对不起。在我放路径的地方,我指的是路径。你想让我告诉你我希望它是如何工作的吗?那也会很有帮助。最后一个path_tem示例给我类似的东西:A=[维亚波尔托,布拉加,5,利托罗尔,维亚布拉加,吉马拉斯,9,内韦,维亚吉马拉斯,阿尔韦卡,7,利托罗,维亚尔韦卡,法罗,10,蒙大拿];我希望我的道路能给我这样的东西:A=[viaporto,braga,5,litoral,neve,viabraga,Guimareas,9,neve,montanha,viaguimaraes,alverca,7,litoral,litoral,viaalverca,faro,10,montanha,litoral];你试过使用吗?-gtrace,path_Temperto,faro,C,6002000?
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).