LINUX.ORG.RU

Сообщения okay

 

[swi-prolog] проблема со списками

Форум — Development

Задание по прологу: Составить процедуру вставки в словарь, реализуемый линейным списком, элемента вида (строка, целое), где строка - ключ, целое - значение. Реализуемое отображение 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).

По прологу нуб, пишу вторую программу. Помогите исправить код, или хотя бы приведите пример кода со вставкой элемента в середину списка.

okay
()

RSS подписка на новые темы