(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).

测试时:

据我所知,这意味着序言能够为 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 来显示其他解决方案,唯一的其他解决方案就是失败(试试看!)