我有一个允许用户输入单引号字符串(A)的函数,然后在子列表(X)列表中搜索字符串并返回包含字符串的子列表:
process(6, X) :-
nl, write('\tEnter student name or ID: '),
read(A),
% FIRST WE CHECK FOR A in the ID SLOT
member( [A,B,C] , X)
% IF TRUE, DISPLAY DATA THEN PASS X back to menu
-> write('\tID="'), write(A), write('", Name="'), write(B), write('", Grade='), write(C),nl,nl, menu(X)
% ELSE, WE CHECK FOR A in the NAME SLOT
; write(A), write(' not found in ID slot'), nl, checkNAME(A, X).
checkNAME(A,X) :-
member( [B,A,C] , X )
% IF TRUE (A in NAME SLOT)
-> blah blah
% ELSE
; blah blah
我的问题是当我在ELSE子句中使用变量A时,我得到垃圾数据“L1_233”或w / e,这会阻止ELSE子句正常工作。我试图创建一个A的副本并在ELSE子句中使用它,但它只是创建一个垃圾数据的副本。为什么变量A在IF CLAUSE而不是ELSE中起作用?感谢
答案 0 :(得分:2)
您有运营商优先权问题。
在Prolog中," AND" (逗号)的优先级高于->
。所以nl, write(...), read(A)
被认为是->
的上半部分(前因)的一部分。如果前提失败,那么Prolog将回溯到read(A)
之前的某个点,A
如果"其他"}将不会被实例化。路径被采取。你需要括起来:
process(6, X) :-
nl, write('\tEnter student name or ID: '),
read(A),
% FIRST WE CHECK FOR A in the ID SLOT
( member( [A,B,C] , X)
% IF TRUE, DISPLAY DATA THEN PASS X back to menu
-> write('\tID="'), write(A),
write('", Name="'), write(B),
write('", Grade='), write(C),
nl,nl, menu(X)
% ELSE, WE CHECK FOR A in the NAME SLOT
; write(A), write(' not found in ID slot'),
nl, checkNAME(A, X)
).
"和" (逗号)的优先级也高于" OR" (分号)因此,结果和其他AND序列不需要括号分组。