Prolog问题的帮助

时间:2010-03-04 01:33:25

标签: list prolog

我正在努力学习prolog,并遇到了一个我无法弄清楚的问题。问题是编写一个prolog谓词,它获取一个小于给定数字的列表的所有数字,并将它们放入将返回的列表中。例如:

输入: findNum(5,[5,3,5,6,4,5],Y)

输出: Y = [3,4]

我尝试的一切似乎都失败了。所以任何帮助将不胜感激。感谢。

1 个答案:

答案 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).