1

長さn桁のリストに記入する必要があります。n-1が1から9の範囲にあり、1桁が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-9と範囲内の1つの数字1-99

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

4

3 に答える 3

1

を使用してください。

:- 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).

サンプルクエリ:

?- digits10plusdigit100_n(Zs,1).
  Zs = [1]
; Zs = [2]
; Zs = [3]
...
; Zs = [98]
; Zs = [99]
; false.

?- digits10plusdigit100_n(Zs,3).
  Zs = [1,1,1]
; Zs = [1,1,2]
; Zs = [1,1,3]
...
; Zs = [1,2,1]
; Zs = [1,2,2]
...
; Zs = [1,9,8]
; Zs = [1,9,9]
; Zs = [2,1,1]
; Zs = [2,1,2]
...
; Zs = [2,1,3]
; Zs = [2,1,4]
...
; Zs = [98,9,9]
; Zs = [99,1,1]
; Zs = [99,1,2]
...
; Zs = [99,9,8]
; Zs = [99,9,9]
; false.
于 2015-08-19T19:43:03.350 に答える
0

これは、 @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] ;
于 2012-04-06T22:57:54.270 に答える
0

述語を逆にするように変更しbetween(10,99,X) 、10 未満の数値を生成してから、10 を超える最後の変数を生成します。

于 2012-04-06T19:14:39.320 に答える