【问题标题】:Prolog membership predicate without dif or when没有 diff 或 when 的 Prolog 成员谓词
【发布时间】:2020-04-14 16:58:59
【问题描述】:

以下序言逻辑

memberd(X, [X|_T]).
memberd(X, [Y| T]) :- dif(X,Y), memberd(X, T).

会产生

?- memberd(a, [a, b, a]).
true
?- memberd(X, [a, b, a]).
X = a ;
X = b ;
false.
?- memberd(X, [a, b, a, c, a, d, b]).
X = a ;
X = b ;
X = c ;
X = d ;
false.

是否有 prolog 逻辑可用于在不使用 when()dif() 函数或加载的 prolog 库中的任何内容的情况下产生相同的结果。只用纯逻辑?

【问题讨论】:

  • dif/2 纯逻辑!
  • @GuyCoder:见this
  • 使用本站前,需要先get informed
  • 我将您的问题回滚到版本 1。如果您想提出后续问题,请随时提出,但不要将问题的内容更改为(可能)无效的地步已经给出了有效的答案。

标签: prolog logic


【解决方案1】:

要从字面上回答您的问题,只需使用:

?- setof(t, member(X, [a,b,a]), _).
   X = a
;  X = b.

但是,有些答案可能不是最理想的:

?- setof(t,member(a,[a,X]),_).
   true
;  X = a.  % redundant

... 而memberd/2 完美回答:

?- memberd(a,[a,X]).
   true
;  false.

其实如果你用library(reif)搭配

memberd(E, [X|Xs]) :-
   if_(E = X, true, memberd(E, Xs) ).

你会得到最好的答案:

?- memberd(a,[a,X]).
   true.

【讨论】:

    猜你喜欢
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多