我已经看到类似的问题,同时prolog输出真假 . 人们建议使用剪切算子(!)或“一次” . 我理解为什么prolog产生真假,我理解切割算子是如何工作的,但我只是不知道放在哪里 . 无论如何这是我的代码(我在记事本上写了):
is_classroom_occupied(mon, 8, 8_348).
is_classroom_occupied(wed, 8, 8_348).
is_classroom_occupied(fri, 8, 8_348).
is_classroom_occupied(mon, 12, 9_285).
is_classroom_occupied(wed, 12, 9_285).
is_classroom_occupied(fri, 12, 9_285).
is_classroom_occupied(mon, 2, 8_247).
is_classroom_occupied(wed, 2, 8_247).
is_classroom_occupied(fri, 2, 8_247).
is_classroom_occupied(tu, 5, 8_348).
is_classroom_occupied(thu, 5, 8_348).
is_classroom_occupied(day, timeslot, location) :-
is_classroom_occupied(mon, 8, 8_348),
is_classroom_occupied(wed, 8, 8_348),
is_classroom_occupied(fri, 8, 8_348),
is_classroom_occupied(mon, 12, 9_285),
is_classroom_occupied(wed, 12, 9_285),
is_classroom_occupied(fri, 12, 9_285),
is_classroom_occupied(mon, 2, 8_247),
is_classroom_occupied(wed, 2, 8_247),
is_classroom_occupied(fri, 2, 8_247),
is_classroom_occupied(tu, 5, 8_348),
is_classroom_occupied(thu, 5, 8_348).
上半部分是一系列事实,显示我的课程的日期,时间和房间号,第二部分是规则 . 这是一个示例查询:
?- is_classroom_occupied(mon, 8, 8_348).
它输出
true ;
false.
但我只希望它输出第一个结果而忽略其余的结果 . 我知道我可以这样做:
?- is_classroom_occupied(mon, 8, 8_348),!.
或者这使程序工作 .
?- once(is_classroom_occupied(mon, 8, 8_348)).
我在记事本上编写规则,然后使用prolog上的咨询来使用包含我所有事实和规则的文件 . 我不想在prolog上使用“once”或cut操作符,我想以某种方式在记事本上创建规则时实现它 .
1 回答
我建议将
is_classroom_occupied
包装到另一个谓词中,该谓词将检查教室是否被占用并且最多会成功一次 .现在,当您查阅该文件时,可以使用
check_classroom_occupied
而不是is_classroom_occupied
.有可能巧妙地重写
is_classroom_occupied
,以便它利用子句索引最多成功一次,但鉴于您的示例数据,这似乎很难......此外,如Willem Van Onsem所述,您的最后一个条款似乎没有意义,应该删除 .