Я действительно застрял на проблеме в Prolog. Я пытаюсь создать генератор "gen_lists_of_pairs (V, L)", который, учитывая список натуральных чисел V, генерирует все возможные списки, содержащие двухэлементные списки, так что их элементы уникальны, и каждый элемент имеет форму [ A, B], где A и B являются членами V и A Это мой код:
ascending([_]).
ascending([A, B|L]) :- A < B, ascending([B|L]).
gen_list_of_pairs(_, []).
gen_list_of_pairs(V, [[X,Y]|L]) :-
gen_list_of_pairs(V, L),
member(X, V),
member(Y, V),
ascending([X, Y]),
not((member([X, Y], L))).
И это трассировка отладки при вызове «gen_list_of_pairs ([1], X).»:
Call:gen_list_of_pairs([1], _7086)
Exit:gen_list_of_pairs([1], [])
X = []
Redo:gen_list_of_pairs([1], _7086)
Call:gen_list_of_pairs([1], _7902)
Exit:gen_list_of_pairs([1], [])
Call:lists:member(_7906, [1])
Exit:lists:member(1, [1])
Call:lists:member(_7912, [1])
Exit:lists:member(1, [1])
Call:ascending([1, 1])
Call:1<1
Fail:1<1
Fail:ascending([1, 1])
Redo:gen_list_of_pairs([1], _7902)
Call:gen_list_of_pairs([1], _7920)
Exit:gen_list_of_pairs([1], [])
Call:lists:member(_7924, [1])
Exit:lists:member(1, [1])
Call:lists:member(_7930, [1])
Exit:lists:member(1, [1])
Call:ascending([1, 1])
Call:1<1
Fail:1<1
Fail:ascending([1, 1])
Redo:gen_list_of_pairs([1], _7920)
...
Как видите, после вывода «X = []» пролог застревает в бесконечном l oop, пробуя пару [1,1] снова и снова, даже несмотря на то, что, насколько мне известно, он должен либо попытаться сделать что-то еще, либо остановить запрос после неудачной попытки ... Я вообще не могу понять это происходит, и я становлюсь все более разочарованным. Любая помощь будет принята с благодарностью ...