You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 14:35:26