1
我试图在Prolog中创建自己的排序规则,经过大量的试验和错误之后,除了按下按钮之外,我能够使其工作。在swipl中,它会将我列表的最后一个值添加到列表中。为什么Prolog在分号后重复列表的最后一个值?
使用的代码如下:
分钟以列表找到的最小值,并返回它
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.
删除发现你想在列表中删除的元素,并返回与列表删除元素
最后,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?
通过remove/3的第一个子句,你指的是remove(_,[],[])?我想这只会返回一个空列表,如果有什么试图从空列表中删除。我认为如果元素不属于,这将是一个很好的最后递归步骤。 –
另外,在删除规则中,删除(1,[2],List)返回List = []。如果没有正确的调用,我不希望单个元素列表丢失它的项目。 –
看起来你是对的,我最初的remove/3的实现被打破了,对不起。这现在已经修复(希望),我已经更新了答案。此外,删除/ 3我提到的也不同于我们的remove/3,因为它删除了所有出现的元素“瞬间”,而删除/ 3在回溯期间逐个删除它们。 –