首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Prolog: String数据在String子句中没有正确显示

Prolog: String数据在String子句中没有正确显示
EN

Stack Overflow用户
提问于 2014-04-14 00:37:37
回答 1查看 64关注 0票数 0

我有一个函数,允许用户输入一个单引号字符串(A),然后搜索一个子列表(X)以查找该字符串,并返回包含该字符串的子列表:

代码语言:javascript
运行
复制
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子句中工作,而在其他子句中不工作?谢谢

EN

Stack Overflow用户

回答已采纳

发布于 2014-04-14 01:24:51

你遇到了操作符优先问题。

在Prolog中,"AND“(逗号)的优先级高于->。因此,nl, write(...), read(A)都被认为是->前半部分的一部分。如果先行词失败,那么Prolog将返回到read(A)A不会被实例化之前的某个点,如果采用“否则”路径。您需要使用括号:

代码语言:javascript
运行
复制
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序列进行括号分组。

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23050202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档