Jak deklarovat seznam v Prologu?

hlasů
1

I procházet přes různé odpovědi na SO o tom, jak deklarovat seznam, ale Dostávám chybové zprávy. Čtu sekci na seznamech z knihy, které mám, ale ještě stále není příkladem toho, jak je správně deklarovat. Dělám projekt pro mé třídě. Mám náhodný soubor otázek, ale když uživatel odpoví, kdo pak na tuto otázku nelze opakovat (otázky mají být náhodné).

Mám tato část provést, ale chtěl jsem se vytvořit seznam tak, že když je otázka položená, chci dodat, že počet otázek na mém seznamu. Zkoušel jsem různé způsoby, a já stále nemůže udělat!

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

Tento úryvek je jen proto, aby číselníku. Jak tomu rozumím já chci, aby se zasadila X, v tomto případě 0 na čele seznamu. Vzhledem k tomu, můj seznam byl deklarován jako prázdná Počítám, že to bude fungovat. Jsem dostat tuto chybu:

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

Snažil jsem se pochopit, co to znamená, ale proto, že kód každého z nás je jiný, existuje mnoho různých odpovědí a já jsem ohromen. Toto je poprvé, co jsem programování v Prologu.

Položena 27/11/2018 v 18:04
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
3

Nemáte oprávnění upravovat statické postup `(=) / 2'

V Prologu nechcete sestavit seznam tím, že prohlásí, jak jste se snažil dělat s

list = [].

Hodnoty Prolog začít s malými písmeny a proměnné začít s velkými písmeny. To není běžné u programovacích jazyků, ale usnadňuje vytváření nových proměnných, nemusíte deklarovat, stačí použít velká písmena, kde je třeba proměnnou.

Prolog nevyužívá úkol, nebo mají metody. Prolog využívá syntaktický sjednocení a má predikáty. Takže když vidíte []jako argumentu předávaný, že je při sestavování rozpisu, buď zjištěna početně, nebo sjednoceny s proměnnou.

Pravděpodobně budete chtít něco takového

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).      
Odpovězeno 27/11/2018 v 18:10
zdroj uživatelem

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