Как объявить список в Прологе? - PullRequest
0 голосов
/ 27 ноября 2018

Я просмотрел различные ответы на SO о том, как объявить список, но я продолжаю получать сообщения об ошибках.Я читаю раздел списков из имеющейся у меня книги, но до сих пор нет примера того, как правильно их объявить.Я делаю проект для своего класса.У меня есть случайный набор вопросов, но когда пользователь отвечает на один, этот вопрос не может быть повторен (вопросы должны быть случайными).

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

test(N):- list(P), member(N, P).
list = [].

start :-
    write('Answer the questions correctly'), nl,
    X is 0,
    push(X,list,[X|list]),
    test(X).

Этот фрагмент просто для составления списка кода.Насколько я понимаю, я хочу нажать X, в данном случае 0, в начало списка.Поскольку мой список был объявлен пустым, я полагаю, что он будет работать.Я получаю эту ошибку:

No permission to modify static procedure `(=)/2'

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

1 Ответ

0 голосов
/ 27 ноября 2018

Нет прав на изменение статической процедуры `(=) / 2 '

В Prolog вы не создаете список, объявляя их, как пытались сделать с

list = [].

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

Пролог не использует присваивание или имеетметоды.Пролог использует синтаксическое объединение и имеет предикаты.Поэтому, когда вы видите [] в качестве передаваемого аргумента, тогда список либо создается, либо объединяется с переменной.

Возможно, вы хотите что-то подобное

begin :-
    % In the next statement I am doing what you would consider 
    % constructing a list.
    ask([]).    

ask(List) :-
    write('Answer the questions correctly'), nl,
    get_answer(A),
    % Here the answer in A is added to the head of the list using
    % the list operator that combines a head with a tail, `|`.
    % This is how your idea of a push is done with a list.
    test([A|List]).

% When this is called from 
% get_answer(A), A will be unified with 0. 
get_answer(0).

% The next predicate `test` with two clauses does what your were trying to do with
% `member(N,P)`. It uses recursion which needs one clause to recursively process
% a list and one clause, the base case, to handle an empty list.

% When the list is empty, do nothing.
test([]). 

test([H|T]) :-
    % H is the head of the list
    % do something with head of list by adding more code here.
    % T is the tail of the list.
    % Recursively call test with the tail of the list
    % to process the remainder of the list.
    test(T).      
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...