Prolog中如何将多症状匹配的疾病结果合并为单个连续列表
嘿,这个问题其实很好解决,在Prolog里有两种常用的思路来处理这个需求:
方法一:一次性生成合并后的候选列表(推荐)
不用分多次调用findall/3,而是把所有要查询的症状放到一个列表里,在findall的目标逻辑里遍历这个列表,一次性匹配所有对应疾病。
比如先把输入的症状存为一个列表:
Symptoms = [fever, hypertonia].
然后执行下面的查询:
findall(Disease, (member(Symptom, Symptoms), symptom(Disease, Symptom)), CombinedPossibles).
Prolog会自动遍历每个症状,找出对应的疾病,最后把所有结果收集到单个连续列表CombinedPossibles里,结果就是[smallpox, shingles, tetanus](顺序可能会根据事实定义的顺序略有不同,但肯定是单列表结构)。
方法二:合并已生成的多个候选列表
如果你已经分别为每个症状生成了单独的列表(比如Possibles1 = [smallpox, shingles]和Possibles2 = [tetanus]),可以用Prolog内置的append/3谓词来合并它们:
append(Possibles1, Possibles2, CombinedList).
执行后CombinedList就会变成[smallpox, shingles, tetanus]。如果有更多列表需要合并,还可以直接传入列表的列表一次性处理:
append([Possibles1, Possibles2, Possibles3], CombinedList).
额外小技巧:去重
如果某个疾病对应多个输入症状,会在合并后的列表里重复出现。如果需要得到无重复的疾病列表,可以用sort/2谓词处理:
sort(CombinedPossibles, UniqueCombined).
比如输入症状是[fever, rash]时,原始合并列表会是[smallpox, shingles, smallpox],经过sort后就会变成[shingles, smallpox](同时会自动排序)。
内容的提问来源于stack exchange,提问作者user10876930
相关产品推荐
相关产品推荐

