我正在开发一个Prolog程序。它生成正确的输出(列表),但列表末尾有一个未实例化的变量。我做错了,不确定如何摆脱它。
这是代码:
plaatsingen([],_).
plaatsingen([Prod/Hoev|Rest],[Order|Plaatsing]) :-
prijs(Lev,Prod,Prijs),
Kost is Prijs*Hoev,
Order = Lev/Prod/Kost,
plaatsingen(Rest,Plaatsing).
prijs(delhaize, zeep, 8).
prijs(delhaize, prei, 10).
prijs(delhaize, zout, 6).
prijs(carrefour, prei, 9).
prijs(carrefour, soep, 19).
prijs(champion, zeep, 7).
prijs(champion, prei, 11).
prijs(champion, pinda, 6).
这是输入和输出:
41 ?- plaatsingen([zeep/10, prei/14],P).
P = [delhaize/zeep/80, delhaize/prei/140|_G4160] .
答案 0 :(得分:1)
如果你想摆脱它,你需要掌握它:
plaatsingen([],G,G).
plaatsingen([Prod/Hoev|Rest],[Order|Plaatsing],G) :-
prijs(Lev,Prod,Prijs),
Kost is Prijs*Hoev,
Order = Lev/Prod/Kost,
plaatsingen(Rest,Plaatsing,G).
G
就是这样一个句柄。现在,您明确地返回未实例化的尾部,并将其设置为任何内容:
plaatsingen(In, Out, Z), Z=[].
将列表的结尾设置为空列表。或者您可以使用
预先设置它plaatsingen(In, Out, [end, of, list]).
或将其保留为免费的logvar,这是差异列表的机制。
答案 1 :(得分:0)
面对列表处理问题时,请尝试查看Prolog builtin是否可以提供帮助:
plaatsingen(I, Orders) :-
maplist(plaatsingen_c, I, Orders).
plaatsingen_c(Prod/Hoev, Lev/Prod/Kost) :-
prijs(Lev,Prod,Prijs),
Kost is Prijs*Hoev.
产量
3 ?- plaatsingen([zeep/10, prei/14],P).
P = [delhaize/zeep/80, delhaize/prei/140] ;
P = [delhaize/zeep/80, carrefour/prei/126]
...
更容易,不是吗?有关更复杂的处理,请参阅' all solutions'和aggregation