Prolog:类型错误:“可评估”预期,找到`[]'(empty_list)

时间:2017-11-11 07:04:00

标签: prolog

我正在尝试从列表中删除满足给定约束的元素。用户输入预算,并删除价格高于预算的项目。咨询文件时出现类型错误。

:- use_module(library(lists)).

main(_) :- 
   write('Enter budget'),
   nl,
   read(Budget),
   write(Buget),
   numlist(1,168,MasterList),
   BudgetList is [],
   apply_budget(MasterList, Budget, BudgetList),
   write(BudgetList).

apply_budget([],_,_).
apply_budget([H | T], B, R) :-
   price(H, Pr),
   (Pr > B ->
       apply_budget(T, B, R);
       append(R, [H], L),
       R is L,
       apply_budget(T, B, R)
   ).

1 个答案:

答案 0 :(得分:0)

你完全写了这个,好像这是一种必要的语言。您根本无法删除Prolog中列表中的元素。在Prolog中,一切都是不可改变的。如果您有列表,则无法更改列表。你只能创造新的东西。因此,如果要从列表中删除元素,则需要创建一个没有要删除的元素的新列表。

以下是您应该如何编写apply_budget谓词:

apply_budget([],_,[]).
apply_budget([H|Ts],B,Rs) :- price(H, P), P > B, !, apply_budget(Ts,B,Rs).
apply_budget([H|Ts],B,[H|Rs]) :- apply_budget(Ts,B,Rs).

第一种情况是,当有一个空列表时,你不关心预算,应该出现一个空列表。

当值H大于B时,第二种情况就是这样,所以我们扔掉了H并递归。 !(cut)用于防止反向跟踪,因此如果我们失败,则不会尝试第三个谓词。

第三种情况是H小于或等于B的情况。在这种情况下,我们通过将H构建(不删除)到输出上来保留[H|Rs]

可以通过以这种方式编写代码来删除剪切:

apply_budget([],_,[]).
apply_budget([H|Ts],B,Rs) :- price(H, P), P > B, apply_budget(Ts,B,Rs).
apply_budget([H|Ts],B,[H|Rs]) :- price(H, P), P =< B, apply_budget(Ts,B,Rs).

我认为这会变得不那么容易管理,但你可以决定哪个更好。