【发布时间】:2019-08-05 12:51:55
【问题描述】:
test(X,[ ],0).
test(X,[H|T], N) :- H >= X, test (X,T,N1), N is N1+1.
test (X,[H|T], N) :- H < X, test (X,T,N).
使用上面的 Prolog 程序为以下查询绘制搜索(派生)树。
|?- test (7,[9, 5, 2, 10, 7,8], N) .
【问题讨论】:
test(X,[ ],0).
test(X,[H|T], N) :- H >= X, test (X,T,N1), N is N1+1.
test (X,[H|T], N) :- H < X, test (X,T,N).
使用上面的 Prolog 程序为以下查询绘制搜索(派生)树。
|?- test (7,[9, 5, 2, 10, 7,8], N) .
【问题讨论】:
这是一个简单的递归:一个谓词在 3 种不同的情况下被调用到自身,这样它遍历列表,将它们的元素与给定的元素 (X) 进行比较。
基本情况(第一个谓词)是列表为空,因此没有元素可以大于或等于给定的元素。 第二个和第三个谓词将列表的第一个元素 (H) 与给定的 (X) 进行比较,如果 H 大于或等于 X,那么我们在第二个谓词中,因此我们将 1 与结果相加对列表的其余部分执行相同的操作。否则,如果 H 小于 X,则我们返回将谓词应用于列表其余部分的结果。
很容易看到例如调用
测试 (2,[1,2,3], N) 。
N 将是 2:
test(2,[1,2,3],2) -> test(2,[2,3],2) -> test(2,[3],1) -> test(2,[ ],0)。
【讨论】: