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)的主要内容,如果未能解决你的问题,请参考以下文章

graphQL查询:收到错误“类型的预期值......,找到......”

类型错误:序列项 0:预期字符串,找到无类型

发布功能错误:找到没有类型名称的条目

当我把它反过来说出来时,为什么Prolog找不到总和?

语法错误:。或表达式1错误编译失败后预期的运算符

WSO2:将CSV消息转换为json wso2 esb。在prolog中出现意外字符'“'(代码34)失败;预期'