2015-10-24 3 views
1

Я новичок в Prolog, и я пытаюсь перечислить предикаты перестановки.SICStus Prolog: Как переставить список [0,1,2,3,4,5,6,7,8,9]

Большинство из них принимают два аргумента (например, permutation/2).

Я ищу, чтобы создать тот, который принимает только один аргумент (список), а также выясняет, имеет ли список ровно 10 элементов.

Так, например:

| ?- permutation([7, 1, 2, 3, 4, 5, 6, 0, 8, 9]). 
yes 

| ?- permutation(X). 
X = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; 
...  

| ?- permutation([A,B,C,D,E,F,G,H,I,J]). 
A = 0 
B = 1 
C = 2 
... 
J = 9 ; 

Цените любые советы!

+1

Возможный дубликат [размещени Пролог] (http://stackoverflow.com/questions/27350677/permutation-prolog) –

+0

Хм я не думаю, что это так, так как им просят о перестановке/1, а не перестановка/2 – Layos

+1

просто определить перестановка10 (X): - перестановка (10, X). Затем вы можете вызвать перестановку10 ([7, 1, 2, 3, 4, 5, 6, 0, 8, 9]), перестановку 10 (X) или перестановку 10 ([A, B, C, D, E, F, G, H, I, J]) и т. Д. –

ответ

0

Хорошо, спасибо за ответы! Это работает:

takeout(X,[X|R],R). 
takeout(X,[F|R],[F|S]) :- 
    takeout(X,R,S). 

perm([X|Y],Z) :- 
    perm(Y,W), 
    takeout(X,Z,W). 
perm([],[]). 

gen_perm(List) :- 
    perm([0,1,2,3,4,5,6,7,8,9],List), 
    length(List,10). 
+0

Если 'perm' работает правильно, вам не нужно' length (List, 10) ', так как' perm' не должен генерировать список 'List', который состоит только из элементов из' [0,1,2, 3,4,5,6,7,8,9] '. – lurker

2

Работа умнее, а не больше: Использование !

:- use_module(library(clpfd)). 

Использование length/2, domain/2, all_different/1 и labeling/2 мы определяем:

perm10(Zs) :- 
    length(Zs,10), 
    domain(Zs,0,9), 
    all_different(Zs), 
    labeling([],Zs). 

Рассмотрим задачу gen_perm([8,0,1,2,3,4,5,6,7,8]). Мы ожидаем, что к сбою, и, на самом деле, это делает ...
... но сколько работы выполняются выполнением выше целей?

Давайте измерять время автономной работы используя call_time/2!

 
?- use_module(library(between),[repeat/1]). 
true. 

?- _Zs = [8,0,1,2,3,4,5,6,7,8], call_time((repeat(1000),gen_perm(_Zs);true),T_us). 
T_us = 21940. 

?- _Zs = [8,0,1,2,3,4,5,6,7,8], call_time((repeat(1000),perm10(_Zs) ;true),T_us). 
T_us = 10. 

Сноска 1: Там будут только 8 различных целых чисел в списке, поэтому он не может быть перестановка всех целых чисел от 0 до 9.
Сноска 2: Использование SICStus Prolog версии 4.3.2, x86_64-linux-glibc2.12.

+1

Еще проще: perm10 (Zs): - сортировка (Zs, _, [0,1,2,3,4,5,6,7,8,9]), маркировка (Zs) .' – jschimpf

Смежные вопросы