Prolog 第二种解决方案是否更有效?

Prolog 第二种解决方案是否更有效?,prolog,Prolog,想知道下面第二个解决方案的后期编译是否更有效 第一个解决方案: write_data([]). write_data([_]) :- write('LAST!'),nl. write_data([X|Rest]) :- Rest = [_|_], write(X),nl, write_data(Rest). write_data([]). write_data([H|T]) :- write_data(T, H). write_data([], _)

想知道下面第二个解决方案的后期编译是否更有效

第一个解决方案:

write_data([]).
write_data([_]) :-
    write('LAST!'),nl.
write_data([X|Rest]) :-
    Rest = [_|_],
    write(X),nl,
    write_data(Rest).
write_data([]).
write_data([H|T]) :-
    write_data(T, H).

write_data([], _) :-
    write('LAST!'),nl.
write_data([H|T], X) :-
    write(X),nl,
    write_data(T, H).
第二种解决方案:

write_data([]).
write_data([_]) :-
    write('LAST!'),nl.
write_data([X|Rest]) :-
    Rest = [_|_],
    write(X),nl,
    write_data(Rest).
write_data([]).
write_data([H|T]) :-
    write_data(T, H).

write_data([], _) :-
    write('LAST!'),nl.
write_data([H|T], X) :-
    write(X),nl,
    write_data(T, H).
一些游泳魔术:

?- [library(vm)] .

?- vm_list(write_data) , halt.
第一个解决方案swipl magic::

========================================================================
write_data/1
========================================================================
   0 s_virgin
   1 i_exit
----------------------------------------
clause 1 (<clause>(0xb002c300)):
----------------------------------------
   0 h_nil
   1 i_exitfact
----------------------------------------
clause 2 (<clause>(0xb017da50)):
----------------------------------------
   0 h_list
   1 h_void
   2 h_nil
   3 h_pop
   4 i_enter
   5 b_atom('LAST!')
   7 i_call(write/1)
   9 i_depart(nl/0)
  11 i_exit
----------------------------------------
clause 3 (<clause>(0xb002bc80)):
----------------------------------------
   0 h_list_ff(1,2)
   3 i_enter
   4 b_unify_var(2)
   6 h_list
   7 h_pop
   8 b_unify_exit
   9 b_var1
  10 i_call(write/1)
  12 i_call(nl/0)
  14 b_var2
  15 i_depart(write_data/1)
  17 i_exit
========================================================================
write_data/1
========================================================================
   0 s_virgin
   1 i_exit
----------------------------------------
clause 1 (<clause>(0xb272c300)):
----------------------------------------
   0 h_nil
   1 i_exitfact
----------------------------------------
clause 2 (<clause>(0xb27288c0)):
----------------------------------------
   0 h_list_ff(1,2)
   3 i_enter
   4 b_var2
   5 b_var1
   6 i_depart(write_data/2)
   8 i_exit
========================================================================
write_data/2
========================================================================
   0 s_virgin
   1 i_exit
----------------------------------------
clause 1 (<clause>(0xb2728920)):
----------------------------------------
   0 h_nil
   1 i_enter
   2 b_atom('LAST!')
   4 i_call(write/1)
   6 i_depart(nl/0)
   8 i_exit
----------------------------------------
clause 2 (<clause>(0xb272bc80)):
----------------------------------------
   0 h_list_ff(2,3)
   3 i_enter
   4 b_var1
   5 i_call(write/1)
   7 i_call(nl/0)
   9 b_var(3)
  11 b_var2
  12 i_depart(write_data/2)
  14 i_exit
========================================================================
写入数据/1
========================================================================
0 s_virgin
1 i_出口
----------------------------------------
第1条((0xb002c300)):
----------------------------------------
0小时零
1我退出
----------------------------------------
第2条((0xb017da50)):
----------------------------------------
0 h_列表
1 h_void
2小时零
3小时流行音乐
4我进去
5个b_原子(“最后一个”)
7 i_呼叫(写入/1)
9 i_出发(nl/0)
11 i_出口
----------------------------------------
第3条((0xb002bc80)):
----------------------------------------
0 h_列表_ff(1,2)
3我进去
4 b_统一_变量(2)
6 h_列表
7小时流行音乐
8 b_统一_出口
9 b_var1
10 i_呼叫(写入/1)
12 i_呼叫(nl/0)
14 b_var2
15 i_出发(写入数据/1)
17 i_出口
第二个解决方案swipl magic::

========================================================================
write_data/1
========================================================================
   0 s_virgin
   1 i_exit
----------------------------------------
clause 1 (<clause>(0xb002c300)):
----------------------------------------
   0 h_nil
   1 i_exitfact
----------------------------------------
clause 2 (<clause>(0xb017da50)):
----------------------------------------
   0 h_list
   1 h_void
   2 h_nil
   3 h_pop
   4 i_enter
   5 b_atom('LAST!')
   7 i_call(write/1)
   9 i_depart(nl/0)
  11 i_exit
----------------------------------------
clause 3 (<clause>(0xb002bc80)):
----------------------------------------
   0 h_list_ff(1,2)
   3 i_enter
   4 b_unify_var(2)
   6 h_list
   7 h_pop
   8 b_unify_exit
   9 b_var1
  10 i_call(write/1)
  12 i_call(nl/0)
  14 b_var2
  15 i_depart(write_data/1)
  17 i_exit
========================================================================
write_data/1
========================================================================
   0 s_virgin
   1 i_exit
----------------------------------------
clause 1 (<clause>(0xb272c300)):
----------------------------------------
   0 h_nil
   1 i_exitfact
----------------------------------------
clause 2 (<clause>(0xb27288c0)):
----------------------------------------
   0 h_list_ff(1,2)
   3 i_enter
   4 b_var2
   5 b_var1
   6 i_depart(write_data/2)
   8 i_exit
========================================================================
write_data/2
========================================================================
   0 s_virgin
   1 i_exit
----------------------------------------
clause 1 (<clause>(0xb2728920)):
----------------------------------------
   0 h_nil
   1 i_enter
   2 b_atom('LAST!')
   4 i_call(write/1)
   6 i_depart(nl/0)
   8 i_exit
----------------------------------------
clause 2 (<clause>(0xb272bc80)):
----------------------------------------
   0 h_list_ff(2,3)
   3 i_enter
   4 b_var1
   5 i_call(write/1)
   7 i_call(nl/0)
   9 b_var(3)
  11 b_var2
  12 i_depart(write_data/2)
  14 i_exit
========================================================================
写入数据/1
========================================================================
0 s_virgin
1 i_出口
----------------------------------------
第1条((0xb272c300)):
----------------------------------------
0小时零
1我退出
----------------------------------------
第2条((0xb27288c0)):
----------------------------------------
0 h_列表_ff(1,2)
3我进去
4 b_var2
5 b_var1
6 i_出发(写入数据/2)
8 i_出口
========================================================================
写入数据/2
========================================================================
0 s_virgin
1 i_出口
----------------------------------------
第1条((0xb2728920)):
----------------------------------------
0小时零
1我进去
2个b_原子(“最后一个!”)
4 i_呼叫(写入/1)
6 i_出发(nl/0)
8 i_出口
----------------------------------------
第2条((0xb272bc80)):
----------------------------------------
0 h_列表_ff(2,3)
3我进去
4 b_var1
5 i_呼叫(写入/1)
7 i_呼叫(nl/0)
9 b_var(3)
11 b_var2
12 i_出发(写入数据/2)
14 i_出口

在提交上面的堆栈溢出时,会显示一条消息“看起来您的文章大部分是代码;请添加更多详细信息。”。人力资源管理。计算机编程问题中的代码太多?(skratches虚拟头)。我是否应该添加一些我在水冷器周围听到的关于新革命“面向束”编程的措辞?

您的第一个实现有一个错误。它不会写出最后一个元素。你的
write_数据([]):-…
应该是
write_数据(X):-write(X),nl,
write_数据([]):-write('LAST!'),nl。
。我可能会写,
write_数据([X,X1 | Rest]):-write(X),nl,write_数据([X1 | Rest])。
。Prolog确实有一些性能谓词,您可以使用它们来确定在每种情况下执行了多少个推断,等等。您可以尝试使用它们来获取一些信息。谢谢@Lougler。代码是另一个讨论中的其他人的代码。他们的意图是将最后一个元素作为一个特殊的案例来捕获,原始版本留下了一个选择点。至于性能差异,几乎没有区别。您的第一个实现有一个错误。它不会写出最后一个元素。你的
write_数据([]):-…
应该是
write_数据(X):-write(X),nl,
write_数据([]):-write('LAST!'),nl。
。我可能会写,
write_数据([X,X1 | Rest]):-write(X),nl,write_数据([X1 | Rest])。
。Prolog确实有一些性能谓词,您可以使用它们来确定在每种情况下执行了多少个推断,等等。您可以尝试使用它们来获取一些信息。谢谢@Lougler。代码是另一个讨论中的其他人的代码。他们的意图是将最后一个元素作为一个特殊的案例来捕获,原始版本留下了一个选择点。至于性能差异,几乎没有什么区别。