Пролог - split_string для каждого элемента в списке - PullRequest
1 голос
/ 16 мая 2019

Я пытаюсь очистить некоторые данные в виде списка, используя split_string для каждого элемента в списке.

Позвольте мне привести пример того, что я имею в виду

Ввод:

[
 'p1\tp2\t100\tStorgatan', 
 'p1\tp3\t200\tLillgatan', 
 'p2\tp4\t100\tNygatan', 
 'p3\tp4\t50\tKungsgatan', 
 'p4\tp5\t150\tKungsgatan'
]

Результат, который я ожидаю после очистки:

[
 [p1, p2, 100, Storgatan], 
 [p1, p3, 200, Lillgatan], 
 [p2, p4, 100, Nygatan], 
 [p3, p4, 50, Kungsgatan], 
 [p4, p5, 150, Kungsgatan]
]

Я пытался написать предикат, который делает это, но по какой-то причине мой предикат не вернет результат (вывод «true»):

data_cleanup([], Res).   
data_cleanup([H|T], Res):-
    split_string(H, "\t", "", L),
    append([L], Res, NewRes),
    data_cleanup(T, NewRes).

Я довольно новичок в Прологе, поэтому мне трудно понять, что я здесь сделал неправильно. Помощь

Спасибо!

1 Ответ

2 голосов
/ 16 мая 2019

Попробуйте так:

data_cleanup([], []).   
data_cleanup([H|T], [A|B]):-
    split_string(H, "\t", "", A),
    data_cleanup(T, B).

Теперь он что-то делает:

?- data_cleanup(['p1\tp2\t100\tStorgatan', 'p1\tp3\t200\tLillgatan', 'p2\tp4\t100\tNygatan', 'p3\tp4\t50\tKungsgatan', 'p4\tp5\t150\tKungsgatan'], Result).
Result = [["p1", "p2", "100", "Storgatan"], ["p1", "p3", "200", "Lillgatan"], ["p2", "p4", "100", "Nygatan"], ["p3", "p4", "50", "Kungsgatan"], ["p4", "p5", "150", "Kungsgatan"]].

Упражнение: определите этот предикат, используя maplist.

РЕДАКТИРОВАТЬ: или еслиВ любом случае вы используете SWI-Prolog, и если вы предпочитаете атомы, а не стриги, вы можете использовать atomic_list_concat/3:

split_atom(Delimiter, Atom, List) :- atomic_list_concat(List, Delimiter, Atom).

, а затем

?- maplist(split_atom('\t'), ['p1\tp2\t100\tStorgatan', 'p1\tp3\t200\tLillgatan', 'p2\tp4\t100\tNygatan', 'p3\tp4\t50\tKungsgatan', 'p4\tp5\t150\tKungsgatan'], L).
L = [[p1, p2, '100', 'Storgatan'], [p1, p3, '200', 'Lillgatan'], [p2, p4, '100', 'Nygatan'], [p3, p4, '50', 'Kungsgatan'], [p4, p5, '150', 'Kungsgatan']].
...