Prolog - 使用否定(声明方法)将member / 2定义为仅对每个数字成功一次

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Prolog - 使用否定(声明方法)将member / 2定义为仅对每个数字成功一次相关的知识,希望对你有一定的参考价值。

我正在尝试为member / 2写一个替代定义,它不会返回数字的重复(即每个元素只会成功一次)。我目前使用切割程序正式使用此代码:

once_member(X,[H|T]) :-
    member(H,T),
    !,
    once_member(X,T).
once_member(H,[H|_]).
once_member(X,[_|T]) :-
    once_member(X,T).

但是,我知道你也可以在声明方法中使用否定来做到这一点,但我无法弄清楚如何去做。如果有人能指出我正确的方向,那将是伟大的。

答案

使用dif/2非常简单:

once_member(X, [X|_]).
once_member(X, [Y|T]) :-
    dif(X, Y),
    once_member(X, T).

1 ?- once_member(A, [1,2,3,3,4]).
A = 1 ;
A = 2 ;
A = 3 ;
A = 4 ;
false.

2 ?- X = a, once_member(X,[A,b]).
X = A, A = a ;
false.

3 ?-  once_member(X,[A,b]), X = a.
X = A, A = a ;
false.

以上是关于Prolog - 使用否定(声明方法)将member / 2定义为仅对每个数字成功一次的主要内容,如果未能解决你的问题,请参考以下文章

MiniKanren 有“非”运算符吗?

Prolog 寻路

数据记录分层

Prolog 程序的复杂性?

Prolog/ASP(Clingo) 到 CLIPS 翻译器

如何在Java中使用Prolog?