1

divide(L,Len,Slist)リストLから割り当てられた長さLenのリストとSlistが統合できる場合に真になる述語を書こうとしていました。たとえば

divide([1,2,3,4,5,6,7],3,Slist).

そのような答えを与えるべきです

Slist=[1,2,3];
Slist=[2,3,4];
Slist=[3,4,5];
Slist=[4,5,6];
Slist=[5,6,7];

しかし、私はより良い方法を見つけることができませんでしたlength(X,Len), sublist(L,X).が、動作が遅すぎます。除算述語はどのように見えるべきですか?

4

2 に答える 2

2

または、この素晴らしい回答で @false で言及されている DCG を使用することもできます。

seq([])     --> [].
seq([E|Es]) --> [E], seq(Es).

divide(List, Length, Result) :-
    length(Result, Length),
    phrase((seq(_), seq(Result), seq(_)), List).
于 2012-03-24T23:47:26.713 に答える
1

sublist/2 は期待どおりに動作しないようです:

?- [library(dialect/sicstus/lists)].
% library(dialect/sicstus/lists) compiled into sicstus_lists 0,00 sec, 14 clauses
true.

?- L=[1,2,3,4,5,6], length(T, 3),sublist(T,L).
L = [1, 2, 3, 4, 5, 6],
T = [1, 2, 3] ;
L = [1, 2, 3, 4, 5, 6],
T = [1, 2, 4] ;
L = [1, 2, 3, 4, 5, 6],
T = [1, 2, 5] ;
....

代わりに append/3 を使用できます:

?- L=[1,2,3,4,5,6], length(T, 3), append(_, Q, L), append(T, _, Q).
L = [1, 2, 3, 4, 5, 6],
T = [1, 2, 3],
Q = [1, 2, 3, 4, 5, 6] ;
L = [1, 2, 3, 4, 5, 6],
T = [2, 3, 4],
Q = [2, 3, 4, 5, 6] ;
L = [1, 2, 3, 4, 5, 6],
T = [3, 4, 5],
Q = [3, 4, 5, 6] ;
L = [1, 2, 3, 4, 5, 6],
T = Q, Q = [4, 5, 6] ;
false.

私はそれが非常に速いとは思わない、ただ不可欠です...

于 2012-03-24T20:30:30.847 に答える