Prolog:类型错误:“可评估”预期,找到`[]'(empty_list)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Prolog:类型错误:“可评估”预期,找到`[]'(empty_list)相关的知识,希望对你有一定的参考价值。
我试图从列表中删除满足给定约束的元素。用户输入预算,并删除价格高于预算的项目。咨询文件时出现类型错误。
:- 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)
).
答案
你写完这篇文章就好像这是一种必要的语言。您根本无法删除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).
我认为这会变得不那么易于管理,但你可以决定哪个更好。
以上是关于Prolog:类型错误:“可评估”预期,找到`[]'(empty_list)的主要内容,如果未能解决你的问题,请参考以下文章