Prolog:字符串数据在ELSE子句中没有正确显示

时间:2014-04-14 00:37:37

标签: prolog

我有一个允许用户输入单引号字符串(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中起作用?感谢

1 个答案:

答案 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序列不需要括号分组。