Prolog 谓词定义的最佳实践
Best Practices for Prolog predicates definition
我定义了谓词duplicate_elements/2,其定义如下:
duplicate_elements(L1, L2): L1 = [a,b], L2 = [a,a,b,b]
我想知道,在两个备选方案 1 和 2 之间,哪个遵循 Prolog 的最佳实践:
duplicate_elements_1([],[]).
duplicate_elements_1([P | R],[P,P | T]) :-
duplicate_elements_1(R , T).
duplicate_elements_2([],[]).
duplicate_elements_2([P | R],[H1,H2 | T]) :-
H1 = P,
H2 = P,
duplicate_elements_2(R , T).
谢谢
which one follows the best practices of Prolog?
第一个。
使用 =/2 并不常见。我并不是说要避免它,但大多数生产代码倾向于重构它们。
有关详细信息,请参阅:Coding Guidelines for Prolog
如果您将 SWI-Prolog 与 Single Side Unification 一起使用,那么使用 =/2 不仅很常见,而且在某些情况下是必要的。
参见:Example of refactoring code to SSU
如果您正在使用 listing/1 to look at DCG code then you will see =/2 经常使用。这是因为编译器正在谨慎行事,没有重构代码以避免引入错误。
我定义了谓词duplicate_elements/2,其定义如下:
duplicate_elements(L1, L2): L1 = [a,b], L2 = [a,a,b,b]
我想知道,在两个备选方案 1 和 2 之间,哪个遵循 Prolog 的最佳实践:
duplicate_elements_1([],[]).
duplicate_elements_1([P | R],[P,P | T]) :-
duplicate_elements_1(R , T).
duplicate_elements_2([],[]).
duplicate_elements_2([P | R],[H1,H2 | T]) :-
H1 = P,
H2 = P,
duplicate_elements_2(R , T).
谢谢
which one follows the best practices of Prolog?
第一个。
使用 =/2 并不常见。我并不是说要避免它,但大多数生产代码倾向于重构它们。
有关详细信息,请参阅:Coding Guidelines for Prolog
如果您将 SWI-Prolog 与 Single Side Unification 一起使用,那么使用 =/2 不仅很常见,而且在某些情况下是必要的。
参见:Example of refactoring code to SSU
如果您正在使用 listing/1 to look at DCG code then you will see =/2 经常使用。这是因为编译器正在谨慎行事,没有重构代码以避免引入错误。