我发现了这样一个用序言编写的朴素排序的例子,我试图理解它:
naive_sort(List,Sorted):-perm(List,Sorted),is_sorted(Sorted).
is_sorted([]).
is_sorted([_]).
is_sorted([X,Y|T]):-X=<Y,is_sorted([Y|T]).
perm(List,[H|Perm]):-delete(H,List,Rest),perm(Rest,Perm).
perm([],[]).
delete(X,[X|T],T).
delete(X,[H|T],[H|NT]):-delete(X,T,NT).
Naive_sort 调用工作正常,但我就是不明白为什么。主要问题是排列。当它被隐式调用时,它总是只返回一个值。那么在 naive_sort 函数调用中如何可能检查所有排列呢?另外,我如何修改 perm 函数来写入所有排列?
主要问题是置换函数。当它被隐式调用时,它总是只返回一个值。
Prolog 是一种总是尝试通过使用给定的公理(事实或规则)推导语句来证明语句的真实性的语言。
perm
不是过程编程意义上的函数。perm
是一个谓词,关于它我们告诉 prolog 两件事:
- 空列表是其自身的排列。
-
List
是一个排列[H|Perm]
如果有一个列表Rest
这样Rest
删除得到H
from List
, and Rest
是一个排列Perm
.
当被问及某个列表是否是另一个列表的排列时,prolog 将尝试(递归地)应用这些推导步骤来证明这一点。如果此递归到达死胡同,即由于无法对它应用任何规则而无法证明的语句,则它会回溯。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)