Prolog 将整数分配给变量 [英] Prolog Assigning integer to a variable
问题描述
我是 Prolog 的新手,并且使用 GNU Prolog,因此不允许使用 clp(fd).我想要做的是对于给定的整数 N,生成一个元素为 1 ~ N 的列表.所以 set(3,T).将输出 T = [1,2,3].这是我目前所拥有的:
I'm new to Prolog, and using GNU Prolog, so no clp(fd) allowed. What I'm trying to do is for a given integer N, generate a list with elements of 1 ~ N. So set(3,T). will output T = [1,2,3]. Here is what I have so far:
set(0,[]).
set(N,T):-set(N-1,T1),append(T1,[N],T).
当我尝试 set(2,T) 时,它崩溃了.我用trace调试,发现它不是在评估N-1,而是在做N-1-1-1...
When I try set(2,T), it crashes. I debugged with trace, and find out that it's not evaluating N-1, but rather doing N-1-1-1...
谁能告诉我如何解决这个问题?谢谢.
Anyone can tell me how to solve this? Thank you.
推荐答案
应该是:
set(N,T):- N2 is N-1, set(N2,T1), append(T1,[N],T).
使用is/2
执行算术运算.N-1
是 -(N,1)
的简写(就像 N2 is N-1
是 is(N2, N-1)
),所以你只是在创建无限树 -(-(-(-(...),1),1,1,1)
.
Arithmetic operations are performed by using is/2
. N-1
is a shorthand for -(N,1)
(just like N2 is N-1
is shorthand for is(N2, N-1)
), so you were just creating infinite tree -(-(-(-(...),1),1,1,1)
.
教育小提示:
如果您希望 set/2
成为正确的关系,以便它可以回答诸如 set(3,X)
, set(X, [1,2,3])
和 set(X,Y)
没有错误,那么你应该这样写这个谓词:
If you want set/2
to be proper relation so it can answer queries like set(3,X)
, set(X, [1,2,3])
and set(X,Y)
without error then you should write this predicate that way:
set(0, []).
set(Value, List) :-
length(List, Value),
append(ShorterList, [Value], List),
ValueMinusOne is Value - 1,
set(ValueMinusOne, ShorterList).
这样算术运算的结果总是可以得到的,因为输入值(列表的长度)要么是明确给出的,要么是从 length/1
生成的.
That way result of arithmetic operation is always possible to obtain because input value (lenght of the list) is either explicitly given or generated from length/1
.
这篇关于Prolog 将整数分配给变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!