#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 «неинтуитивный для начинающих» пожалуйста , давайте не будем туда заходить. Интуиция занимает свое место в математике, естественных науках и даже в компьютерном программировании, но ее значение ужасно переоценено.