如何使列表的变量成为Prolog编程中的全局变量?

时间:2013-12-11 12:07:51

标签: 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),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的东西..但是消息出现错误,'期望原子bla bla'..

1 个答案:

答案 0 :(得分:2)

阅读N诊断并收集它们的可能方法可能是:

% 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个输入,而是逐个用户输入项目,直到完成并收集任意长度的输入列表。