在Prolog编程中,如何使list的变量成为全局变量?

在Prolog编程中,如何使list的变量成为全局变量?,prolog,Prolog,下面是一些代码 diagnosis :- readln(Line1), readln(Line2), readln(Line3), readln(Line4), readln(Line5), readln(Line6), readln(Line7), readln(Line8), readln(Line9), readln(Line10), write(Line1),nl, write(Line2),

下面是一些代码

diagnosis :-
    readln(Line1),
    readln(Line2),
    readln(Line3),
    readln(Line4),
    readln(Line5),
    readln(Line6),
    readln(Line7),
    readln(Line8),
    readln(Line9),
    readln(Line10),
    write(Line1),nl,
    write(Line2),nl,
    write(Line3),nl,
    write(Line4),nl,
    write(Line5),nl,
    write(Line6),nl,
    write(Line7),nl,
    write(Line8),nl,
    write(Line9),nl,
    write(Line10),nl.

在这里,我得到了10行作为列表变量(Line1,…Line10)。问题是如何使这些变量成为全局变量,以便我可以使用其他谓词。。。我使用了像b_setvalue或b_getvalue之类的东西。。但消息中出现了错误,“预期atom bla bla”

读取和收集诊断的一种可能方法是:

% Read N diagnoses and retrieve them in a list
diagnosis(N, Diags) :-
    diagnosis(N, [], D),
    reverse(D, Diags).  % Assuming you want them listed in the order they were read

diagnosis(N, A, Diags) :-
    N > 0,
    rw_diag(Diag),      % read and write one diagnosis
    A1 = [Diag|A],
    N1 is N - 1,
    diagnosis(N1, A1, Diags).
diagnosis(0, A, A).

rw_diag(Diag) :-
    readln(Diag),
    write(Diag), nl.
然后您将调用
diagnosis/2
,如下所示:

diagnosis(10, DiagList).
这将为您提供用户输入的诊断的序言列表。没有全局变量在使用,但是您得到的是一个实例化列表,您可以在任何谓词调用
diagnosis/2
时使用它


这只是一个教学示例。可能有两种不同的方法可以做到这一点,其中一些可能比我所展示的更简单/更好/不同。一个改进可能不是将其硬编码为10个输入,而是让用户一个接一个地输入项目,直到它们完成并收集任意长度的输入列表。

在Prolog中不能使变量成为全局变量。请参阅我在您之前的帖子中提供的答案:。您的“expected atom bla bla…”错误与其他错误有关。如果您收到错误消息,请先仔细阅读,然后尝试找出它的含义(阅读文档或用谷歌搜索),然后,如果这不能解决您的问题,请寻求帮助,包括相关信息,例如您收到的确切错误消息,还有什么没有解决它。其他任何事情都是对那些愿意帮助的人缺乏尊重。严格地说,有办法制造“全局”变量,但很少有必要。在OP的例子中,绝对不是。@Boris你肯定是对的。我为此感到抱歉。我从别人那里得到了一些线索…下次,我会小心听你的建议。谢谢。@Boris,谢谢,我还没有完全想到这些。请随意评论我对augment.Wow的其他回答。对我来说,这段代码看起来像“艺术”。:)谢谢还有一个问题。你给了我很多帮助!