如何在Prolog投票系统中添加选民美国国籍校验功能?
实现选民国籍检查的方案
首先需要调整原有的谓词结构,加入国籍参数,同时修正原代码中年龄判断的重叠问题(当X=18时两个子句会同时触发)。以下是具体实现:
重构后的完整代码
% 主谓词:检查投票资格,参数为年龄和国籍 voter_eligibility(Age, Nationality) :- Age >= 18, Nationality = usa, write("Candidate is eligible for casting a vote"). voter_eligibility(Age, Nationality) :- (Age < 18 ; Nationality \= usa), write("Candidate is not eligible for casting a vote").
代码说明
- 新增
Nationality参数,用原子usa表示美国国籍,符合Prolog编码习惯 - 第一个子句同时满足年龄≥18和国籍为美国两个条件时,判定为合格
- 第二个子句用逻辑或(
;)处理两种不合格情况:年龄小于18,或者国籍不是美国,满足其一即判定不合格 - 修正了原代码中
X=<18的逻辑漏洞,避免18岁时两个子句同时执行的问题
使用示例
% 合格情况:20岁美国人 ?- voter_eligibility(20, usa). Candidate is eligible for casting a vote true. % 不合格情况1:17岁美国人 ?- voter_eligibility(17, usa). Candidate is not eligible for casting a vote true. % 不合格情况2:25岁非美国人 ?- voter_eligibility(25, canada). Candidate is not eligible for casting a vote true.
如果想让代码更易维护,也可以把检查规则拆分为独立的辅助谓词:
% 辅助谓词:检查年龄是否达标 age_eligible(Age) :- Age >= 18. % 辅助谓词:检查国籍是否为美国 nationality_eligible(Nationality) :- Nationality = usa. % 主谓词:整合两项检查 voter_eligibility(Age, Nationality) :- age_eligible(Age), nationality_eligible(Nationality), write("Candidate is eligible for casting a vote"). voter_eligibility(Age, Nationality) :- \+ (age_eligible(Age), nationality_eligible(Nationality)), write("Candidate is not eligible for casting a vote").
这种拆分方式让规则更模块化,后续修改年龄限制或新增其他检查条件时更方便。
内容的提问来源于stack exchange,提问作者Vaibav Reddy
相关产品推荐
相关产品推荐

