序言。填写清单

时间:2012-04-06 17:39:13

标签: prolog

我必须填写长度为n位的列表。 我知道n-1的范围是1到9,一位数可以是1到99。 我是这样做的:

generate([First|Next],Czynniki):-
    between(1,99,First),
    generate2(Next).

generate2(Next):-
    sublist([1,2,3,4,5,6,7,8,9],Next).

sublist([],[]).
sublist([H|T],[H|S]):-
    sublist(T,S).
sublist([_|T],S):-
    sublist(T,S).

这样做我生成了一些相同的解决方案。 也许您已经知道如何在不重复的情况下生成列表?

修改

为了清楚起见,我(@repeat)在OP中添加了以下相关评论:

  

在入口处我有未定义变量的长度N列表。并希望填写我的列表:N-1区间1-91-99范围内的一个数字。

     

示例:N = 5,L = [56,2,3,4,8] ......

3 个答案:

答案 0 :(得分:1)

使用

from oauth2client.client import GoogleCredentials
credentials = GoogleCredentials.get_application_default()
http = credentials.authorize(httplib2.Http())

让我们像这样定义:- use_module(library(clpfd)).

digits10plusdigit100_n/2

示例查询:

digits10plusdigit100_n(Zs,N) :-
   Zs = [CentDigit|DecDigits],
   length(Zs,N),
   CentDigit in  1..99,
   DecDigits ins 1..9,
   labeling([],Zs).

答案 1 :(得分:0)

可能更改为between(10,99,X) 所以反转你的谓词,生成小于10的数字,然后生成最后一个变量,大于10

答案 2 :(得分:0)

这不仅仅是here ?

中@false非常优雅的变体
gen(Xs) :-
       between(1, 9, L),
       length(Xs, L),
       maplist(between(1,99), Xs).

?- gen(Xs).
Xs = [1] ;
Xs = [2] ;
Xs = [3] ;
Xs = [4] ;
Xs = [5] ;
  ..
Xs = [99] ;
Xs = [1, 1] ;
Xs = [1, 2] ;
Xs = [1, 3] ;
Xs = [1, 4] ;
..
Xs = [1, 98] ;
Xs = [1, 99] ;
Xs = [2, 1] ;
Xs = [2, 2] ;
Xs = [2, 3] ;
Xs = [2, 4] ;
Xs = [2, 5] ;
Xs = [2, 6] ;
相关问题