我正在开发一个用 Prolog 编写的应用程序。我想过滤一个元素列表并删除那些不满足特定约束或条件的元素,保持原始列表顺序。我认为最好的方法是这样的:
filter([],Filtered).
filter([L|List],[F|Filtered]) :-
/* Conditions are met: bypass the element to the filtered list */
check_conditions(L),
filter(List,Filtered).
filter([L|List],Filtered) :-
/* Conditions are not met: do not include the element in the filtered list */
filter_aborts(List,Filtered).
在接受它作为我的问题的解决方案之前,我想(独立地)尝试一下,所以我编译并运行了我的代码(SWI-Prolog)并测试了一些情况。当我使用硬编码列表(或任何您想称呼它的名称)输入 Prolog 查询时,我得到如下内容:
?- filter([id01,id02,id03,id04,id05,id06],F).
F = [id03, id05, id06|_G1024] .
该列表肯定被过滤了,但我_G1024
在它的末尾得到了这个实例名称“”。我知道发生这种情况是因为 F 没有实例化,但我不知道解决方案是什么。此外,如果我尝试做一些不同的事情,比如将列表作为实例化变量输入,我得到的就更奇怪了:
?- L=[id02,id03,id04,id05,id06].
L = [id02, id03, id04, id05, id06].
?- filter(L,F).
L = [] ;
L = [id01],
F = [id01|_G347] ;
L = [id01, id01],
F = [id01, id01|_G403]
... and so on.
Prolog变量不应该是一次赋值变量吗?我的程序是否真的发生了变化L
,或者我没有正确理解它?其中的一部分,因为我是 Prolog 的新手,我将不胜感激任何关于我的 Prolog 的评论 - 比如说...... - “风格”。