Я хочу, чтобы моя программа находила мне все подмножества размера K целых чисел 1,2, ..., N.Застревание в бесконечном цикле в прологе
Для этого я написал следующие подводные лодки (N, X, Y) означает, что Х представляет собой подмножество размера N множества Y. Я определил следующее:
subs(0,[],X).
subs(N,[A|R1],[A|R2]):-N>0, N1 is N-1, subs(N1,R1,R2).
subs(N,[A|R1],[B|R2]):-subs(N,[A|R1],R2).
subs(N,[A|R1],[B|R2]):-subs(N,R1,[B|R2]).
И затем, как я проверил sub (2, X, [1,2,3,4]).
У меня был первый ответ [1,2], но он не дал второго ответа, поскольку он застрял в бесконечном цикле. Я попытался проследить его, и кажется, что после нахождения первого ответа он делает:
Redo: (8) subs(0, _G613, [3, 4]) ? creep
^ Call: (9) 0>0 ? creep
^ Fail: (9) 0>0 ? creep
Redo: (8) subs(0, _G613, [3, 4]) ? creep
Call: (9) subs(0, [_G618|_G619], [4]) ? creep
^ Call: (10) 0>0 ? creep
^ Fail: (10) 0>0 ? creep
Redo: (9) subs(0, [_G618|_G619], [4]) ? creep
Call: (10) subs(0, [_G618|_G619], []) ? creep
Fail: (10) subs(0, [_G618|_G619], []) ? creep
Redo: (9) subs(0, [_G618|_G619], [4]) ? creep
Call: (10) subs(0, _G619, [4]) ? creep
Exit: (10) subs(0, [], [4]) ? creep
Exit: (9) subs(0, [_G618], [4]) ? creep
Exit: (8) subs(0, [_G618], [3, 4]) ? creep
Exit: (7) subs(1, [2, _G618], [2, 3, 4]) ?
Так я вижу, что я застрял с subs(0, _G619, [4])
. Кто-то имеет представление о том, как преодолеть эту проблему?
Thanks
У вашего 4-го предложения есть недостаток. Глава второго аргумента (подмножество) имеет переменную 'A', которая является одноточечной. В этом разделе в основном говорится: '' [A | R1] 'является подмножеством значений' N' из '[B | R2]', если 'R1' является подмножеством значений' N' из '[B | R2]', для любой переменной 'A' *. Это не будет правильным правилом для подмножества. Неясно, какова цель этого правила. – lurker