Prolog 初学者序言问题-比较总是返回false

Prolog 初学者序言问题-比较总是返回false,prolog,Prolog,我有一个非常简单的Prolog函数,但是Prolog总是从比较中返回false,我不知道为什么。我想把字母表中的N字母放到一个列表中。所以如果我用N=6来称呼它,我想要[A,B,C,D,E,F]。谁能告诉我我做错了什么吗 create([],_,_,[]). create([X|XS],Length,Acc,[X|NewList]) :- Acc<Length, create(XS,Length,Acc+1,NewList). 但是如果我去掉Acc,这是一个解决方案,它总结了我们

我有一个非常简单的Prolog函数,但是Prolog总是从比较中返回
false
,我不知道为什么。我想把字母表中的
N
字母放到一个列表中。所以如果我用
N=6
来称呼它,我想要
[A,B,C,D,E,F]
。谁能告诉我我做错了什么吗

create([],_,_,[]).
create([X|XS],Length,Acc,[X|NewList]) :-
    Acc<Length, create(XS,Length,Acc+1,NewList).

但是如果我去掉
Acc,这是一个解决方案,它总结了我们在评论中的讨论,但使用了漂亮的模式匹配:

create(_,Length,Length,[]).
create([Head|Tail],Length,Acc,[Head|NewList]):- 
    Acc<Length, 
    Acc1 is Acc + 1,
    create(Tail,Length,Acc1,NewList).

编辑: 重新考虑一下,我不太确定这是否是您想要的,因为可能在您的第一个子句中,您希望指定当列表的成员少于长度时应该发生什么,即返回完整列表

好的,那么正确的答案是:

create([],_,_,[]).
create(_,Length,Length,[]).
create([Head|Tail],Length,Acc,[Head|NewList]):- 
    Acc<Length, 
    Acc1 is Acc + 1,
    create(Tail,Length,Acc1,NewList).

你看过追踪器了吗?你使用“Acc+1”的方式很有趣,但没关系。第二条评论:你得到的是变量,而不是字母。第三条评论:你需要指定如果长度等于Acc,应该发生什么,抱歉,计算结果与Acc相同。我明白了。我现在明白了。它几乎可以工作,但在最后给了我一个奇怪的数字:NewList=[a,B,C,D,E,F | u 25614]。你知道是什么原因导致的吗?太好了,谢谢你的时间,你能帮助初学者真是太好了。
create(_,Length,Length,[]).
create([Head|Tail],Length,Acc,[Head|NewList]):- 
    Acc<Length, 
    Acc1 is Acc + 1,
    create(Tail,Length,Acc1,NewList).
create(List, Length, Solution):-
    length(Solution, Length),
    append(Solution, _, List).
create([],_,_,[]).
create(_,Length,Length,[]).
create([Head|Tail],Length,Acc,[Head|NewList]):- 
    Acc<Length, 
    Acc1 is Acc + 1,
    create(Tail,Length,Acc1,NewList).
create(List, Length, Solution):-
    length(Solution, Length),
    append(Solution, _, List), 
    !.
create(List, _, List).