我有一个函数,允许用户输入一个单引号字符串(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,这会使use子句无法正常工作。我试着创建一个A的副本,并将其用于use子句中,但它所做的只是创建一个垃圾数据副本。为什么变量A在IF子句中工作,而在其他子句中不工作?谢谢
发布于 2014-04-14 01:24:51
你遇到了操作符优先问题。
在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)
)." and“(逗号)也比"OR”(分号)的优先级高,因此不需要对后继序列和else序列进行括号分组。
https://stackoverflow.com/questions/23050202
复制相似问题