我在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).
当我运行picnic(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.
我的疑问是:正如我所知,切割算子应当在!信号左边的谓词为真时停止搜索替代词。第一个位置信号的含义是什么?为什么解释器会继续搜索可以将其他谓词设为真的其他值?
答案 0 :(得分:2)
这种削减的效果是你的第二次野餐/ 1规则将被完全忽略。在你的计划生涯中,它永远不会有机会开火。
但是回溯仍然在可用的替代方案(切割右侧的目标)中起作用,并且您可以在跟踪中清楚地观察它们。
答案 1 :(得分:0)
Prolog的艺术,第11部分,剪切和否定“从操作上讲,剪切的处理方式如下。目标成功,并将Prolog提交给所有选择,因为父目标与剪切发生在该子句的开头统一了。 。”因此,一旦您的最高目标与您第一次野餐的头一一致,就无法再与您第二次野餐的头一统一。