Prolog程序问题排查:输入diclogenta_eye_drops后返回false的原因
问题分析与修正方案
你的Prolog程序返回false主要有以下几个关键问题:
1. 输入匹配类型不兼容
read(X)读取的是Prolog原子(不带引号的标识符),但代码里用X = "diclogenta_eye_drops"做判断——这里的"diclogenta_eye_drops"是字符串类型,和原子不匹配。当你输入diclogenta_eye_drops回车时,X被绑定为原子diclogenta_eye_drops,和字符串比较必然失败。
修正:把判断条件改成原子匹配:
X = diclogenta_eye_drops
2. 谓词逻辑缺失与递归错误
diclofenac_sodium/1规则里的diclofenac_sodium(diclogenta_eye_drops)是无意义的递归调用——你没有定义diclofenac_sodium/1的事实,反而试图用规则自身做判断,正确的关联应该是从药物到成分的diclogenta_eye_drops(diclofenac_sodium)。
另外,规则里的does_Not/1和does_Not/2没有任何事实或规则定义,Prolog无法找到匹配项直接导致目标失败;同时命名不符合Prolog规范(谓词通常用小写字母+下划线,避免大小写混合)。
修正:
- 替换递归调用为正确的药物-成分关联查询
- 添加
does_not/2事实描述药物安全属性 - 统一谓词命名风格
3. 谓词命名冲突
diclofenac_sodium既是表示药物成分的原子,又是规则的谓词名,容易造成逻辑混淆,建议重命名规则为更清晰的名称,比如safe_drug/1。
修正后的完整代码
% 药物成分的属性事实 anti_inflammatory(diclofenac_sodium). analgesic(diclofenac_sodium). % 药物与成分的关联 contains(diclogenta_eye_drops, diclofenac_sodium). % 药物的安全属性事实 does_not(diclogenta_eye_drops, increase_intra_ocular_pressure). does_not(diclogenta_eye_drops, cause_cataract_formation). does_not(diclogenta_eye_drops, reduce_immune_response). % 判断药物是否符合安全要求的规则 safe_drug(X) :- contains(X, diclofenac_sodium), does_not(X, increase_intra_ocular_pressure), does_not(X, cause_cataract_formation), does_not(X, reduce_immune_response). % 交互入口 medicine :- write("Enter drug name. Use _ (underscore) instead of space bar."), nl, read(X), X = diclogenta_eye_drops, safe_drug(X), write("该药物不会抑制免疫应答、升高眼内压及引发白内障形成.").
内容的提问来源于stack exchange,提问作者Enjee
相关产品推荐
相关产品推荐

