2016-04-23 5 views
0

Я работаю над системным проектом реестра в прологе и использую модифицированную структуру поиска и вставки, основанную на примере, представленном нашим профессором. Однако, когда я пытаюсь запустить его реализацию, предоставленный список записей никогда не включается в список, даже если других элементов нет. Я не очень хорошо знаком с прологом, и эта проблема бросает меня за цикл.Внесение в список списков пролог

Моя реализация метода поиска/вставки следующим образом:

search(_, [], 0). 
search([X,_,_], [[X, _, _]|_], 1). 
search([_,Y,_], [[_, Y, _]|_], 1). 
search([X,Y,Z], [[_, _, _]|T], C) :- search([X, Y, Z], T, C). 
searchinsert([X, Y, Z], L, L) :- search([X, Y, Z], L, 1). 
searchinsert([X, Y, Z], L, [[X, _, _] | L]) :- search([X, Y, Z], L, 0). 
searchinsert([X, Y, Z], L, [[_, Y, _] | L]) :- search([X, Y, Z], L, 0). 

В соответствии с планом, он должен отказаться от предоставленного списка записей, если первый или второй элемент совпадающее другого элемента в списке. Эта функция вызывается следующим образом:

process(4, X) :- 
    nl, 
    write('\tInsert student into roster.'), nl, 
    read_student_info([A, B, C]), 
    nl, nl, searchinsert([A, B, C], X, X). 

ответ

0

Может просто изменить последний звонок:

..., searchinsert([A, B, C], X, 1). 

так X имеет шанс инстанциируемый в список. Но вы должны переосмыслить «поток данных» вашего драйвера process/2, вероятно, у него отсутствует аргумент.

+0

Какой аргумент, по-вашему, я могу пропустить? Единственная информация, которую я веду в драйвер process/2, - это сам список. –

+0

В Prolog переменные «присваивают один раз». Итак, может быть, вам понадобится другая переменная, переданная процессу/2, которая должна получить обновленный список. – CapelliC

Смежные вопросы