Организационни въпроси

Екстра кредит - задачата за пермутациите

Екстра кредит - задачата за пермутациите

от Симеон Попов -
Number of replies: 5
Условието на задачата за пермутациите все още не е напълно коректно - трябва или да се добави изискване X да не е [], или да се промени програмата така, че да обхваща и този случай, например като се добави клаузата p([], [], []) = [].
In reply to Симеон Попов

Re: Екстра кредит - задачата за пермутациите

от Трифон Трифонов -
Според мен такова изискване не се налага, понеже се обхваща от случаите. Би ли уточнил с някой пример къде се проваля програмата?
In reply to Трифон Трифонов

Re: Екстра кредит - задачата за пермутациите

от Симеон Попов -
Програмата се проваля при perm([]). Изхождам от предположението, че perm([]) = p([], [], []) би трябвало да върне []. Не виждам как ще стане това, тъй като на първата клауза е поставено изискване Y \= [], а p([], [], []) не може да се унифицира с втората или третата клауза, защото [] няма глава и, следователно, не може да се унифицира нито с [a], нито с [a|Z].
In reply to Симеон Попов

Re: Екстра кредит - задачата за пермутациите

от Трифон Трифонов -

Прав си, по-добре е програмата да връща резултат за празния списък. Приеми, че X в условието на задачата е непразен.

Всъщност това как работи програмата за непразен списък е въпрос на уговорка, понеже понятието "пермутация на празен списък" не е много смислено. Така, че фактът, че програмата не връща резултат може също да се приеме като коректно поведение. Друга поправка, която ми се струва смислена е да се смени третия ред от

p(X,[],[a]) = [X @ [a]];

на

p(X,[],[]) = [X];

Тогава за празния списък програмата ще връща [[]] - което може да се брои като списък от единствената "пермутация" на празния списък. Разбира се, може да се добави и допълнителен ред:

p(X,[],[]) = [];

както предлагаш ти.

Благодаря ти за внимателната забележка!

In reply to Трифон Трифонов

Re: Екстра кредит - задачата за пермутациите

от Георги Цанков -
А на мен друго нещо не ми е ясно ;)

Кое правило се изпълнява при P([1],[2],[3]) ?
до това стигам по следния начин:
perm([1,2,3]) -> P([],[],[1,2,3])
P([],[],[1,2,3]) -> P([1],[],[2,3]) @ . . .
P([1],[],[2,3]) -> . . . @ P([1],[2],[3])

е, може и да бъркам някъде при изводите де... не знам?