有一些代码如下
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'..
答案 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个输入,而是逐个用户输入项目,直到完成并收集任意长度的输入列表。