(gnu) Prolog 语句 "or" 简单示例
(gnu) Prolog statement with "or" simple example
我为一个相当简单的 GNU Prolog 示例而苦恼:
我有一个文件(test.pl)
cat(muki).
dog(roti).
frog(frogi).
animal(X) :- dog(X).
animal(X) :- cat(X).
测试时:
- 通过
['test.pl']
导入
animal(frogi)
returns no
,符合预期
animal(muki)
returns yes
,符合预期
animal(roti)
returns true ?
而不是 yes
,这不是我所期望的。
据我所知,这意味着序言能够为 roti
解决 animal
但为什么它不能 return 是的,就像以前一样?
比较trace/0
| ?- [user].
compiling user for byte code...
cat(muki).
dog(roti).
frog(frogi).
animal(X) :- dog(X).
animal(X) :- cat(X).
user compiled, 6 lines read - 578 bytes written, 11515 ms
(5 ms) yes
| ?- trace.
The debugger will first creep -- showing everything (trace)
yes
{trace}
| ?- animal(muki).
1 1 Call: animal(muki) ?
2 2 Call: dog(muki) ?
2 2 Fail: dog(muki) ?
2 2 Call: cat(muki) ?
2 2 Exit: cat(muki) ?
1 1 Exit: animal(muki) ?
(2 ms) yes
{trace}
| ?- animal(roti).
1 1 Call: animal(roti) ?
2 2 Call: dog(roti) ?
2 2 Exit: dog(roti) ?
1 1 Exit: animal(roti) ?
true ?
(1 ms) yes
{trace}
| ?- halt.
好的,现在交换两个 animal/1
谓词并再次跟踪
| ?- [user].
compiling user for byte code...
cat(muki).
dog(roti).
frog(frogi).
animal(X) :- cat(X).
animal(X) :- dog(X).
user compiled, 5 lines read - 578 bytes written, 16421 ms
(12 ms) yes
| ?- trace.
The debugger will first creep -- showing everything (trace)
yes
{trace}
| ?- animal(roti).
1 1 Call: animal(roti) ?
2 2 Call: cat(roti) ?
2 2 Fail: cat(roti) ?
2 2 Call: dog(roti) ?
2 2 Exit: dog(roti) ?
1 1 Exit: animal(roti) ?
(1 ms) yes
{trace}
在第二个 运行 上,您可以看到遇到了故障,GNU Prolog 不得不回溯。如果没有回溯并且查询直接为真,没有回溯的替代方法,GNU Prolog 将显示 true
。如果存在回溯并且最终查询成功,并且存在回溯的替代路径,那么 GNU Prolog 将显示 yes
并允许您输入 ;
以显示其他解决方案。在这种情况下,如果您要输入 semi-colon 来显示其他解决方案,唯一的其他解决方案就是失败(试试看!)
我为一个相当简单的 GNU Prolog 示例而苦恼:
我有一个文件(test.pl)
cat(muki).
dog(roti).
frog(frogi).
animal(X) :- dog(X).
animal(X) :- cat(X).
测试时:
- 通过
['test.pl']
导入
animal(frogi)
returnsno
,符合预期animal(muki)
returnsyes
,符合预期animal(roti)
returnstrue ?
而不是yes
,这不是我所期望的。
据我所知,这意味着序言能够为 roti
解决 animal
但为什么它不能 return 是的,就像以前一样?
比较trace/0
| ?- [user].
compiling user for byte code...
cat(muki).
dog(roti).
frog(frogi).
animal(X) :- dog(X).
animal(X) :- cat(X).
user compiled, 6 lines read - 578 bytes written, 11515 ms
(5 ms) yes
| ?- trace.
The debugger will first creep -- showing everything (trace)
yes
{trace}
| ?- animal(muki).
1 1 Call: animal(muki) ?
2 2 Call: dog(muki) ?
2 2 Fail: dog(muki) ?
2 2 Call: cat(muki) ?
2 2 Exit: cat(muki) ?
1 1 Exit: animal(muki) ?
(2 ms) yes
{trace}
| ?- animal(roti).
1 1 Call: animal(roti) ?
2 2 Call: dog(roti) ?
2 2 Exit: dog(roti) ?
1 1 Exit: animal(roti) ?
true ?
(1 ms) yes
{trace}
| ?- halt.
好的,现在交换两个 animal/1
谓词并再次跟踪
| ?- [user].
compiling user for byte code...
cat(muki).
dog(roti).
frog(frogi).
animal(X) :- cat(X).
animal(X) :- dog(X).
user compiled, 5 lines read - 578 bytes written, 16421 ms
(12 ms) yes
| ?- trace.
The debugger will first creep -- showing everything (trace)
yes
{trace}
| ?- animal(roti).
1 1 Call: animal(roti) ?
2 2 Call: cat(roti) ?
2 2 Fail: cat(roti) ?
2 2 Call: dog(roti) ?
2 2 Exit: dog(roti) ?
1 1 Exit: animal(roti) ?
(1 ms) yes
{trace}
在第二个 运行 上,您可以看到遇到了故障,GNU Prolog 不得不回溯。如果没有回溯并且查询直接为真,没有回溯的替代方法,GNU Prolog 将显示 true
。如果存在回溯并且最终查询成功,并且存在回溯的替代路径,那么 GNU Prolog 将显示 yes
并允许您输入 ;
以显示其他解决方案。在这种情况下,如果您要输入 semi-colon 来显示其他解决方案,唯一的其他解决方案就是失败(试试看!)