【发布时间】:2023-04-08 02:31:01
【问题描述】:
我正在尝试在 Prolog 中创建自己的排序规则,经过大量试验和错误,我能够让它工作,除了当我按下 ;在 swipl 中,它会将我列表的最后一个值添加到列表中。
使用的代码如下:
min 在列表中找到一个最小值并返回它
min([H|[]],H).
min([H|T],Min) :-
min(T,CurrentMin),
H < CurrentMin,
Min = H.
min([H|T],Min) :-
min(T,CurrentMin),
CurrentMin =< H,
Min = CurrentMin.
remove 在列表中找到您要删除的元素,并返回已删除元素的列表
remove(_,[],[]).
remove(First,[First|Rest],Rest).
remove(Element,[First|Rest],[First|RestLessElement]) :-
remove(Element,Rest,RestLessElement).
最后,sort_inc 尝试使用上面的规则来创建一个升序的排序列表。
sort_inc([H|[]],[H]).
sort_inc(UnOrderedList,[H|OrderedTail]) :-
min(UnOrderedList,H),
remove(H,UnOrderedList,T),
sort_inc(T,OrderedTail).
排序效果很好,但是当我在列表上运行规则后按 swipl 中的分号时,它将重复列表中的最后一个值:
sort_inc([3,6,8,4],List).
List = [3, 4, 6, 8] ;
List = [3, 4, 6, 8, 8] ;
List = [3, 4, 6, 8, 8, 8] ;
List = [3, 4, 6, 8, 8, 8, 8] ;
List = [3, 4, 6, 8, 8, 8, 8, 8] ;
List = [3, 4, 6, 8, 8, 8, 8, 8, 8] ;
List = [3, 4, 6, 8, 8, 8, 8, 8, 8|...] .
为什么在输入分号时它会重复最后一个值而不是返回false?
【问题讨论】: