Prolog输出正确和错误

时间:2017-01-22 03:03:52

标签: prolog

我已经看到类似的问题,关于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上的剪切操作符,我想以某种方式在记事本++上创建规则时实现它。

1 个答案:

答案 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所述,您的最后一句似乎没有意义,应该删除。