Задание по прологу: Составить процедуру вставки в словарь, реализуемый линейным списком, элемента вида (строка, целое), где строка - ключ, целое - значение. Реализуемое отображение I:N. Контролировать, чтобы не было элементов с одинаковыми ключами. Пишу на Swi-prolog.
:- initialization(goal).
goal :-
new(Dir, directory('.')),
new(Frame, frame('Select file')),
new(Browser, browser),
new(Dialog, dialog),
send(Dialog, append(button('Open', message(@prolog, procfile, Browser?selection?key)))),
send(Dialog, append(button('Quit', message(@prolog, halt)))),
send(Browser, members(Dir?files)),
send(Frame, append(Browser)),
send(Dialog, below(Browser)),
send(Frame, open).
procfile(Fname) :-
see(Fname),
read_list(List),
addwordf(List,List1),
write(Fname,List1),
seen(Fname).
read_list(List) :-
(
at_end_of_stream ->
List = [];
read(Pair), read_list(List1), List = [Pair | List1]
).
addwordf(List, List1) :-
new(D, dialog('Word adding')),
new(Txt1, text_item(value)),
new(Txt2, text_item(key)),
send(D, append, Txt1),
send(D, append, Txt2),
send(D, append, button('Add', message(@prolog, wordadd, prolog(List), Txt1?selection, Txt2?selection, prolog(List1)))),
/*проблема, скорее всего, здесь, т.к. если передавать List1 как аргумент от prolog, его потом нельзя изменить (или я что-то неправильно делал)*/
send(D, open).
wordadd([V/K | [V1/K1 | Tail ] ], Value, Key, TempList) :-
TempList1 = [TempList | V/K],
(
Key=:=K ->
new(Der, dialog),
send(Der, append, text('program is fucked up because of your key')),
send(Der, open);
(
Key>K ->
wordadd([V1/K1 | Tail], Value, Key, TempList1);
List1 = [TempList1 , Value/Key | Tail],
TempList = TempList1
)
).
showResult(F) :-
new(D, dialog('RESULT')),
new(B, button('Exit', message(D, destroy))),
new(V, view(F)),
send(D, append(B)),
send(D, append(V)),
send(V, load(F)),
send(D, open).
По прологу нуб, пишу вторую программу. Помогите исправить код, или хотя бы приведите пример кода со вставкой элемента в середину списка.