第一个谓词中的Prolog割算子
我在Prolog中有以下基础:第一个谓词中的Prolog割算子,prolog,Prolog,我在Prolog中有以下基础: holiday(friday,may1). weather(friday,fair). weather(saturday,fair). weather(sunday,fair). weekend(saturday). weekend(sunday). picnic(Day) :- !,weather(Day,fair), weekend(Day). picnic(Day) :- holiday(Day,may1). 当我运行野餐(When)。我得到以下跟踪:
holiday(friday,may1).
weather(friday,fair).
weather(saturday,fair).
weather(sunday,fair).
weekend(saturday).
weekend(sunday).
picnic(Day) :- !,weather(Day,fair), weekend(Day).
picnic(Day) :- holiday(Day,may1).
当我运行野餐(When)。
我得到以下跟踪:
[trace] ?- picnic(When).
Call: (6) picnic(_G716) ? creep
Call: (7) weather(_G716, fair) ? creep
Exit: (7) weather(friday, fair) ? creep
Call: (7) weekend(friday) ? creep
Fail: (7) weekend(friday) ? creep
Redo: (7) weather(_G716, fair) ? creep
Exit: (7) weather(saturday, fair) ? creep
Call: (7) weekend(saturday) ? creep
Exit: (7) weekend(saturday) ? creep
Exit: (6) picnic(saturday) ? creep
When = saturday ;
Redo: (7) weather(_G716, fair) ? creep
Exit: (7) weather(sunday, fair) ? creep
Call: (7) weekend(sunday) ? creep
Exit: (7) weekend(sunday) ? creep
Exit: (6) picnic(sunday) ? creep
When = sunday.
我的疑问是:据我所知,当谓词位于左侧时,cut操作符应该停止搜索替代项信号为真。第一个位置的信号是什么意思?为什么解释器一直在搜索另一个可以使其他谓词变为真的值?这样做的结果是,您的第二个野餐/1规则将被完全忽略。在您的程序生命周期中,它将永远不会有机会启动
但是回溯仍然在可用的备选方案中起作用(目标位于切割右侧),你可以在追踪中清楚地观察到它们。序言艺术,第11部分,切割和否定“在操作上,切割处理如下。目标成功,并将序言提交给所有选择,因为父目标与切割发生的子句的开头统一。“因此,一旦您的最高目标与第一次野餐的开头统一/1,它就不能与第二次野餐的开头统一/1。谢谢,现在我理解了切割的含义。