2015-04-28 4 views
1

У меня есть список X, содержащий три элемента; ID, имя и класс. Все взято с пользовательского вводаРаспечатка элементов списка в прологе

read_student_info([A, B, C]), 
nl, nl, menu([[A, B, C] | X]). 

read_student_info([A, B, C]) :- 
    write('\tStudent ID: '), 
    read(A), 
    write('\tStudent Name: '), 
    read(B), 
    write('\tStudent Grade: '), 
    read(C). 

Теперь я хочу отобразить элементы из списка. Поэтому, если у меня есть ученик, чей ID = 3, Name = Tom, Grade = 78. Вот что я хотел бы распечатать. Текущая функция Я дурачиться с это:

show_records(X) :- 
    X = [A | B], 
    A = [C | D], 
    id = write(C), 
    name = format("~s", [B]), 
    grade = write(D), 
    show_records(B). 

Однако я буду первым, чтобы признать, что я почти не понятия, что я делаю. Любая помощь будет очень оценена!

ответ

2

просто указывает путь к очистке:

show_records([]). 
show_records([A|B]) :- 
    format('ID = ~w\tName = ~w\tGrade = ~w~n',A), 
    show_records(B). 

тест:

?- show_records([[1,abel,10], [2,goofy,4]]). 
ID = 1 Name = abel Grade = 10 
ID = 2 Name = goofy Grade = 4 

ясно, вкладки не являются оптимальными, но простой в использовании

0

У меня это выяснено, в основном все равно. Вот мой пересмотр.

show_records(X) :- 
X = [A | B], 
write('\tID = '), 
A = [C | D], 
write(C), 
write('\tName = '), 
D = [E | F], 
format("~s", [E]), 
write('\tGrade = '), 
F = [G | H], 
write(G), 
nl, 
show_records(B). 
+0

Я предлагаю вам использовать только один раз явное унификацию '=/2': если вместо' X = [A | B] 'вы пишете' X = [[C, E, G | _] | B] 'и избавиться от других явных унификаций, ваша программа станет более читаемой. И, кстати, если ваш 'H' is' [] ', то это подсписка имеет только 3 элемента, тогда вы должны написать' X = [[C, E, G] | B] '. – migfilg