Как я могу распечатать содержимое списка, хранящегося в базе данных, по одному?

#prolog #swi-prolog

Вопрос:

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

Моя мысль заключается в том, что если я открою (проконсультируюсь) с этим в SWI-Прологе, я смогу запустить код с помощью go(). и заставить его выводить значения в списке значений.

 valueslist(['papua new guinea',botswana,'netherlands antilles',sweden,cameroon]).  printlist([]). printlist([X|List]) :-  write(X),nl,  printlist(List).  go :-  write('Here is an example list of countries: '), nl,  printlist(valueslist).  

Как и сейчас, код просто печатается Here is an example list of countries: , за которым следует false.

Я хотел, чтобы он напечатал это Here us an example... , а затем список стран, например

 papua new guinea botswana netherlands antilles sweden cameroon  

Как бы правильно сделать что-то подобное в Прологе?

Ответ №1:

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

Код, который выводит список, выглядит так:

 valueslist(['papua new guinea',botswana,'netherlands antilles',sweden,cameroon]).  printlist([]). printlist([X|List]) :-  write(X),nl,  printlist(List).  go :-  write('Here is an example list of countries: '), nl,  valueslist(List),  printlist(List).  

Комментарии:

1. Именно так это и должно быть сделано, молодец!

2. @IsabelleNewbie хм, хм. Для побочных эффектов было бы лучше использовать цикл, управляемый отказом, или его лучший эквивалент forall/2 . forall(member(X, List), writeln(X))

3. Это было бы альтернативой. Тот, который является новым и неинтуитивным для начинающих. Почему это должно быть лучше ? И почему бы и нет maplist(writeln, List) , если мы действительно хотим скрыть итерацию?

4. @IsabelleNewbie Я ничего не хочу скрывать. Все три: 1. maplist, 2. forall и 3. классический цикл, управляемый отказом, с repeat, ( ..., fail ; true ) различными действиями, когда дело доходит до отказа и возврата. Поэтому вам нужно выбрать правильный в зависимости от конкретной потребности. Для побочных эффектов, в частности , forall обычно лучше всего подходит.

5. @IsabelleNewbie «неинтуитивный для начинающих» пожалуйста , давайте не будем туда заходить. Интуиция занимает свое место в математике, естественных науках и даже в компьютерном программировании, но ее значение ужасно переоценено.