我已经看到类似的问题,关于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)).
我正在编写关于notepad ++的规则,然后使用prolog上的consult来使用包含我所有事实和规则的文件。我不想使用"一次"或prolog上的剪切操作符,我想以某种方式在记事本++上创建规则时实现它。
答案 0 :(得分:0)
我建议将is_classroom_occupied
包装到另一个谓词中,该谓词将检查教室是否被占用并且最多只能成功一次。
check_classroom_occupied(Day, Timeslot, Location) :-
is_classroom_occupied(Day, Timeslot, Location), !.
现在,当您查阅该文件时,可以使用check_classroom_occupied
代替is_classroom_occupied
。
有可能巧妙地重写is_classroom_occupied
,以便它利用子句索引最多成功一次,但是根据你的示例数据,这似乎很难......
另外,如Willem Van Onsem所述,您的最后一句似乎没有意义,应该删除。