Prolog:填充n个元素的列表

时间:2013-05-08 01:59:23

标签: prolog

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

这就是我所做的,我从来没有能够在Prolog中正确地使用if,else ..结构:

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 = []。

1 个答案:

答案 0 :(得分:5)

你误解了Prolog是如何被使用的。谓词不完全是函数,所以它们不能返回。如果将参数绑定到实例化变量:

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

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

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

应该怎么办?列表应该是[a,a,a],还是第二个和第三个参数应该是b2

一个非常简单的fill

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

如果使用不当会失败,但你应该弄清楚它是如何使用的。

注意:尽量避免在谓词定义的主体中进行显式统一。