我正在努力学习prolog,并遇到了一个我无法弄清楚的问题。问题是编写一个prolog谓词,它获取一个小于给定数字的列表的所有数字,并将它们放入将返回的列表中。例如:
输入: findNum(5,[5,3,5,6,4,5],Y)
输出: Y = [3,4]
我尝试的一切似乎都失败了。所以任何帮助将不胜感激。感谢。
答案 0 :(得分:2)
要解决此问题,您将使用典型的Prolog模式,一次一个地检查输入列表中的元素。 Prolog包含从列表中选择head元素的语法,通过将列表与[A | B]
统一,列表的第一个元素与A
统一,列表的其余部分(如果没有元素则为空) ()与B
统一。
您应该首先考虑您需要多少条款。您将需要一个子句来处理空列表的情况,这也是递归的终止条件。每次检查列表中的一个项目时,都会递归检查列表的其余部分。在期末考试中,“名单的剩余部分”是空的。
对于检查列表的head元素的子句,您有两个可能的条件:元素满足您的搜索条件(小于'num'),或者不满足。要表示这一点,请实现两个子句,这两个子句遍历列表,但只有第一个匹配您的搜索条件。检测“匹配”元素的子句必须首先写在Prolog文件中,以便首先考虑它。
% This clause is for the "empty input" case which is also used to
% discontinue the recursion when finished.
findNum( _, [], []).
% This clause completes only if the first input element is less than
% 'M'. If the clause completes, the first input element ('X') is unified
% with the output list ([X | Y]).
findNum( M, [X | L], [X | Y]) :-
X < M,
findNum(M, L, Y).
% This clause completes if the above clauses do not. Much like an "else"
% case, this clause simply removes the first input element from the list,
% the element must not match in the search clause above and so we will now
% discard it. Thus, it is unified with the "throw away" variable named "_"
findNum( M, [_ | L], Y) :-
findNum(M, L, Y).