Условието на задачата за пермутациите все още не е напълно коректно - трябва или да се добави изискване X да не е [], или да се промени програмата така, че да обхваща и този случай, например като се добави клаузата p([], [], []) = [].
Според мен такова изискване не се налага, понеже се обхваща от случаите. Би ли уточнил с някой пример къде се проваля програмата?
Програмата се проваля при perm([]). Изхождам от предположението, че perm([]) = p([], [], []) би трябвало да върне []. Не виждам как ще стане това, тъй като на първата клауза е поставено изискване Y \= [], а p([], [], []) не може да се унифицира с втората или третата клауза, защото [] няма глава и, следователно, не може да се унифицира нито с [a], нито с [a|Z].
Прав си, по-добре е програмата да връща резултат за празния списък. Приеми, че X в условието на задачата е непразен.
Всъщност това как работи програмата за непразен списък е въпрос на уговорка, понеже понятието "пермутация на празен списък" не е много смислено. Така, че фактът, че програмата не връща резултат може също да се приеме като коректно поведение. Друга поправка, която ми се струва смислена е да се смени третия ред от
p(X,[],[a]) = [X @ [a]];
на
p(X,[],[]) = [X];
Тогава за празния списък програмата ще връща [[]] - което може да се брои като списък от единствената "пермутация" на празния списък. Разбира се, може да се добави и допълнителен ред:
p(X,[],[]) = [];
както предлагаш ти.
Благодаря ти за внимателната забележка!
А на мен друго нещо не ми е ясно ;)
Кое правило се изпълнява при 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])
е, може и да бъркам някъде при изводите де... не знам?
Кое правило се изпълнява при 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])
е, може и да бъркам някъде при изводите де... не знам?
p(X, Y, [a|Z]): X = [1], Y = [2], a = 3, Z = [].