首页 文章

Prolog输出正确和错误

提问于
浏览
0

我已经看到类似的问题,同时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 回答

  • 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所述,您的最后一个条款似乎没有意义,应该删除 .

相关问题