Prolog 将整数分配给变量 [英] Prolog Assigning integer to a variable

查看:50
本文介绍了Prolog 将整数分配给变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是 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-1is(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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆