需要制作谓词,填充(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 = []。
答案 0 :(得分:5)
你误解了Prolog是如何被使用的。谓词不完全是函数,所以它们不能返回。如果将参数绑定到实例化变量:
?- fill([a,a,a], a, 4).
fail
唯一合情合理的是Prolog告诉你,“这不正确”。无论如何,在这个例子中:
?- fill([b,b], a, 3).
应该怎么办?列表应该是[a,a,a]
,还是第二个和第三个参数应该是b
和2
?
一个非常简单的fill
:
fill([], _, 0).
fill([X|Xs], X, N) :- succ(N0, N), fill(Xs, X, N0).
如果使用不当会失败,但你应该弄清楚它是如何使用的。
注意:尽量避免在谓词定义的主体中进行显式统一。