0

需要做一个谓词,fill(L,X,N),其中 L 是一个包含 N 个元素 X 的列表。如果 N <= 0 或 N != L 的长度,L 应该是一个空列表。

这是我所做的,我从来没有能够让 if, else.. 结构在 Prolog 中正常工作:

fill(L,X,N) :-
   ((N =< 0) -> 
   L = [];
   length(L,I),
   ((N =\+= I) -> 
   L = [];
   fill2(L,X,N))).
fill2([H|T],X,N2) :-
   NewN = N2 - 1,
   H = X,
   fill2(T,X,NewN).

我还有一个更简单的版本,除了 N != L 的长度时有效

fill(L,_,N) :-
   N =< 0,
   L = [].
fill([H|T],X,N) :-
   NewN = N - 1,
   H = X,
   fill(T,X,NewN).

因此,例如,fill(L,20,4) 返回 L = [20,20,20,20],但 fill([20,20,20],X,2) 不返回 L = []。

4

1 回答 1

6

您误解了 Prolog 的用途。谓词不完全是函数,因此它们不能返回。如果将参数绑定到实例化变量:

?- fill([a,a,a], a, 4).
fail

唯一明智的是 Prolog 告诉你,“这是不正确的”。无论如何,在这个例子中:

?- fill([b,b], a, 3).

应该发生什么?列表应该是[a,a,a],还是第二个和第三个参数应该是band 2

一个非常简单的fill

fill([], _, 0).
fill([X|Xs], X, N) :- succ(N0, N), fill(Xs, X, N0).

如果使用不当,它会失败,但你应该明确它需要如何使用。

注意:尽量避免在谓词定义的主体中明确统一。

于 2013-05-08T02:23:28.173 回答