我在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中编程。
答案 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).