如何在Prolog中声明列表?

时间:2018-11-27 18:04:19

标签: list prolog

我在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'

我试图理解这意味着什么,但是由于每个人的代码都不相同,所以答案很多,而我不知所措。这是我第一次在Prolog中编程。

1 个答案:

答案 0 :(得分:3)

  

无权修改静态过程`(=)/ 2'

在Prolog中,您不会通过尝试进行声明来构造列表

list = [].

序言值以小写字母开头,变量以大写字母开头。这在编程语言中并不常见,但是可以轻松创建新变量,无需声明它们,只需在需要变量的地方使用大写字母即可。

Prolog不使用分配或具有方法。 Prolog使用句法统一并具有谓词。因此,当您看到[]作为传递的参数时,即是列表被构造或与变量统一。

您可能想要这样的东西

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