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 经常使用。这是因为编译器正在谨慎行事,没有重构代码以避免引入错误。