3

这个问题要求我们对 Prolog 进行编码,如果列表 L 中没有元素小于 A,则当 M 为 A 时满足;否则当 M 是列表 L 的最小值时满足

minLessThan([],A,A).
minLessThan([H|T], A, M) :-
   H >= A,
   M is A,
   minLessThan(T, A, M).
minLessThan([H|T], A, M) :-
   H < A,
   M is H,
   minLessThan(T, A, M).

现在,我的结果对句子的第一部分有效,但是当 M 是列表 L 的最小值时它一直返回 false,我假设当列表 L 为空时出现问题,它返回 A,有什么办法可以解决这个问题?

4

2 回答 2

2

由于这是家庭作业,我只会给你一些建议:

对于您要执行的操作,在递归步骤之前,您不应在第二个和第三个子句中实例化 M 。也就是说,您不必放置M is AandM is H因为 M 将在基本情况(第一个子句)中被实例化。

此外,第三个子句中的递归调用应该使用H而不是A作为第二个参数,因为您找到了一个小于当前最小值的项目。

注意 的第二个参数minLessThan可以读作“找到的当前最小值”,所以你应该调用过程给出一些初始值,否则会发生实例化错误。

于 2012-08-15T15:55:26.997 回答
0
minLessThan([],A,A).

minLessThan([H|T], A, M) :-
    H >= A,
    minLessThan(T, A, M).

minLessThan([H|T], A, M) :-
    H < A,
    minLessThan(T, H, M).

这是我编辑的答案,现在可以正常工作。

于 2012-08-16T00:28:16.663 回答