如何解决SWI-Prolog中的Syntax error及Singleton变量警告?
解决SWI-Prolog的语法错误与单例变量警告
一、修复语法错误
1. 闭合未完成的括号
grossvater_von/2谓词存在未闭合的括号,且句点位置错误。原代码末尾的mutter_von(C,B).需要补上两个右括号,并将句点移到整个谓词的最后:
grossvater_von(A,B) :- maennlich(A), ( vorfahr_von(A,C), ( vater_von(C,B) ; mutter_von(C,B) ) ).
2. 修正否定表达式的用法
SWI-Prolog中推荐用\+替代not表示否定,且被否定的析取表达式需要用括号完整包裹。einzelkind/1中的否定部分应修改为:
einzelkind(A) :- ( vater_von(_,A) ; mutter_von(_,A) ), \+ ( bruder_von(A,_) ; schwester_von(A,_) ).
二、消除单例变量警告
单例变量指谓词中仅出现一次的变量,可使用下划线_替代,明确表示无需使用该变量的值:
einzelkind/1中的B、C、D、E:替换为_,避免单例警告;- 若无需引用
schwester_von/2中母亲的具体身份,也可将C改为_,但保留C能确保是同一个母亲,若weiblich/1有对应事实则不会触发警告。
三、补充缺失的性别事实
代码中调用了weiblich/1和maennlich/1谓词,但未定义对应事实,需补充:
weiblich(Marianne). weiblich(Barbara). weiblich(Anna-Lena). weiblich(Ursula). weiblich(Uta). weiblich(Sabrina). maennlich(Stefan). maennlich(Christopher). maennlich(Christian). maennlich(Ralf). maennlich(Timo). maennlich(Thomas). maennlich(Sven).
四、完整修正后的代码
schwester_von(A,B) :- weiblich(C), mutter_von(C,A), mutter_von(C,B), A \== B. grossvater_von(A,B) :- maennlich(A), ( vorfahr_von(A,C), ( vater_von(C,B) ; mutter_von(C,B) ) ). vorfahr_von(A,B) :- vater_von(A,B) ; mutter_von(A,B) ; ( ( vater_von(A,C) ; mutter_von(A,C) ), vorfahr_von(C,B) ). einzelkind(A) :- ( vater_von(_,A) ; mutter_von(_,A) ), \+ ( bruder_von(A,_) ; schwester_von(A,_) ). % 性别事实 weiblich(Marianne). weiblich(Barbara). weiblich(Anna-Lena). weiblich(Ursula). weiblich(Uta). weiblich(Sabrina). maennlich(Stefan). maennlich(Christopher). maennlich(Christian). maennlich(Ralf). maennlich(Timo). maennlich(Thomas). maennlich(Sven). % 亲属关系事实 vater_von(Stefan,Barbara). vater_von(Stefan,Anna-Lena). mutter_von(Marianne,Barbara). mutter_von(Marianne,Anna-Lena). mutter_von(Barbara,Timo). vater_von(Christopher,Timo). mutter_von(Anna-Lena,Ursula). mutter_von(Anna-Lena,Thomas). vater_von(Christian,Ursula). vater_von(Christian,Thomas). mutter_von(Ursula,Uta). vater_von(Ralf,Uta). vater_von(Thomas,Sven). mutter_von(Sabrina,Sven).
内容的提问来源于stack exchange,提问作者daniel235
相关产品推荐
相关产品推荐

