Prolog列表有未实例化的尾部,需要摆脱它

时间:2013-12-30 11:37:55

标签: list prolog

我正在开发一个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] .

2 个答案:

答案 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