Prolog谓词间返回值传递失败,求正确实现方案
修复Prolog谓词参数传递问题
我来帮你解决这个问题,你的代码核心问题在于没有把chooseusertype中读取的用户类型传递给startas,而且对Prolog的变量绑定和参数模式理解有点偏差,具体修复方案如下:
问题分析
你原来的代码里,chooseusertype只是读取了输入并打印,但没有把读取到的值传递出去;同时main(-Usertype)里的参数模式声明(-表示输出参数)并没有实际作用,因为Usertype始终是未绑定的自由变量,startas(Usertype)无法匹配到startas('merchant')或startas('customer')这两个具体的子句,所以整个目标失败,返回false。
修复后的完整代码
% 主入口:先获取用户类型,再根据类型启动对应流程 main :- chooseusertype(Usertype), startas(Usertype). % 修改chooseusertype,增加参数返回读取到的用户类型 chooseusertype(Usertype) :- write('Log in as a merchant or customer?: '), read(Usertype), % 直接将输入绑定到Usertype变量 format('Your log in type: ~w~n', [Usertype]). % 换行让输出更清晰 % 不同用户类型的处理逻辑 startas('merchant') :- write('Logged in as merchant'), nl, write('Any update on the shelves?'). startas('customer') :- write('Logged in as customer'), nl, write('Let us help you find the ingredients you want!').
执行效果
当你运行main.后,输入customer.(注意Prolog的read/1需要输入以句号结尾),会得到如下输出:
Log in as a merchant or customer?: customer. Your log in type: customer Logged in as customer Let us help you find the ingredients you want!
额外优化(可选)
如果觉得输入必须加句号太麻烦,可以改用read_line_to_codes/2读取整行输入(无需句号),再转换成原子:
chooseusertype(Usertype) :- write('Log in as a merchant or customer?: '), read_line_to_codes(user_input, InputCodes), atom_codes(Usertype, InputCodes), format('Your log in type: ~w~n', [Usertype]).
这样用户直接输入customer(不加句号)就能正常运行。
内容的提问来源于stack exchange,提问作者furitetepporaa
相关产品推荐
相关产品推荐

