0

我需要用有限数量的元素初始化一些列表,都是一样的。

fill( 0, [], _ ) :- !.
fill( Index, [Value|List], Value ) :-
    NextIndex is Index - 1,
    fill( NextIndex, List, Value ).

切割是强制性的,以避免无限递归和失败结果。

我试图修改规则#2,但在给出预期的解决方案后,目标失败:

fill( Index, [Value|List], Value ) :-
    Index > 0,
    NextIndex is Index - 1,
    fill( NextIndex, List, Value ).

这个怎么运作:

?- fill( 7, AllFalse, false ).
AllFalse = [false, false, false, false, false, false, false].

?-
4

2 回答 2

0
eq(X, Y) :- X = Y.
fill(N, Xs, V) :-
    length(Xs, N), maplist(eq(V), Xs).

虽然这没有外部削减,length/2但让它们处于生成模式。

您正在解构一个整数值,在检查它的值时,您总是会创建一个选择点。如果有一个自然数数学实现如下,那么你可以有一个确定性的填充谓词。

nat(0).
nat(suc(X)) :- nat(X).

fill_nat(0, [], _).
fill_nat(suc(N), [V|Xs], V) :-
    fill_nat(N, Xs, V).

?- fill_nat(suc(suc(suc(0))), Xs, a).
Xs = [a, a, a].
于 2020-11-15T11:35:52.370 回答
0

我相信这可以正常工作:

fill(0, [], _).
fill(N, [Val|Tail], Val) :- 
    N > 0,
    N2 is N-1,
    fill(N2, Tail, Val).

(这相当于你的第二个版本,没有删减)

?- fill(2, X, 33).
X = [33, 33] .

?-

但是在给出预期的解决方案之后,目标失败了

它为您提供一种解决方案,如果您想要更多解决方案,那么它会说“没有任何解决方案”。

?- fill(2, X, 33).
X = [33, 33] ;
false.

?-
于 2020-11-15T17:41:58.603 回答