Como declarar uma lista em Prolog?

votos
1

I tenha visualizado através de várias respostas sobre SO sobre como declarar uma lista, mas eu continuo recebendo mensagens de erro. Estou a ler a seção sobre listas de um livro que eu tenho, mas ainda não é um exemplo de como declará-los corretamente. Estou fazendo um projeto para minha classe. Eu tenho um conjunto aleatório de perguntas, mas quando o usuário responde a um, então essa pergunta não pode ser repetido (perguntas são para ser aleatório).

Eu tenho esta parte feito, mas eu queria criar uma lista para que quando uma pergunta é feita, eu quero adicionar esse número pergunta à minha lista. Eu tentei várias maneiras e eu ainda não pode fazê-lo!

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).

Este trecho é apenas para tornar o código lista. Pelo que entendi que eu quero empurrar X, neste caso 0, à cabeça da lista. Desde a minha lista foi declarada como vazia Eu acho que ele iria trabalhar. Estou recebendo este erro:

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

Tentei entender o que isso significa, mas porque o código de cada um é diferente, há muitas respostas diferentes e estou sobrecarregado. Esta é a minha primeira vez em programação Prolog.

Publicado 27/11/2018 em 18:04
fonte usuário
Em outras línguas...                            


1 respostas

votos
3

Sem permissão para modificar procedimento estático `(=) / 2'

Em Prolog você não construir lista, declarando-os como você tentou fazer com

list = [].

valores Prolog começar com letras minúsculas e variáveis ​​começam com letras maiúsculas. Isso não é comum entre as linguagens de programação, mas torna mais fácil para criar novas variáveis, você não tem que declará-los, basta usar uma letra maiúscula, onde você precisa de uma variável.

O Prolog não usar a atribuição ou ter métodos. Prolog usa unificação sintática e tem predicados. Então, quando você ver []como um argumento a ser transmitido, que é quando a lista é ou construído, ou unificado com uma variável.

Você provavelmente vai querer algo parecido com isto

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).      
Respondeu 27/11/2018 em 18:10
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more