我正在尝试从列表中删除满足给定约束的元素。用户输入预算,并删除价格高于预算的项目。咨询文件时出现类型错误。
:- 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)
).
答案 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).
我认为这会变得不那么容易管理,但你可以决定哪个更好。