【问题标题】:Element handling issue in Prolog, but not in a regular list?Prolog 中的元素处理问题,但不在常规列表中?
【发布时间】:2013-04-22 11:24:33
【问题描述】:

我正在尝试在 Prolog 中编写一个元素处理函数。它与 prolog 谓词 member/2 几乎相同,但它必须以不同的方式完成工作。为了具体;我必须说 member/2 谓词函数是这样的:

member(X, [X|_]).
member(X, [_|Tail]) :-
   member(X,Tail).

当你给出一个查询例如:member(X, [1,2,3])

它会按此顺序为您提供所有重做的X = 1; X = 2; X = 3;。我想要一个几乎相同的元素功能。当我给出这样的查询时,我希望成员函数得到相同的结果:

element(X, (1,2,3)).

区别只是括号而不是像这样的括号:[]
为了做到这一点,我尝试了:

element(X, (X,_)).
element(X, (_,Tail)) :-
   element(X,Tail).

与 member/2 谓词函数实现完全相同。但这不起作用,因为它没有给出最后一个元素 X=3. 所以我又补充了一个事实:

element(X, X).

但这也不起作用,因为(显然)它用像这样的真实元素给出了不必要的答案:

X=(1,2,3)
X=(2,3)

我该如何处理?

【问题讨论】:

  • 您的member/2 代码已关闭:它应该是[_|Tail],而不是[_,Tail]
  • 是的,我在这里写错了对不起,我现在改正了。顺便说一句,正如你所说,我在程序中以正确的方式使用它。

标签: list prolog element member


【解决方案1】:

看来一刀可以解决你的问题:

element(X, (X, _)).
element(X, (_, Tail)) :-
    !, element(X, Tail).
element(X, X).

测试:

?- element(X, (1,2,3)).
X = 1 ;
X = 2 ;
X = 3.

?- element(2, (1,2,3,2)).
true ;
true.

【讨论】:

  • 非常感谢,看不到这个真不好意思。我尝试使用剪辑,但因为我对 prolog 很陌生,所以无法将其正确放置在必要的地方。我试图弄清楚 prolog 在测试时如何通过 trace 选项在不同情况下工作,但我无法真正理解 cut (!) 运算符的作用。任何人都可以以适当的方式解释它吗?再次感谢您的回答。
  • 我找到了这样的解释,看起来不错;我现在可以理解更多,但对于使用我必须习惯它:[link](en.wikipedia.org/wiki/Cut_(logic_programming).
【解决方案2】:

Prolog 中的 (1,2,3) 等术语以逗号作为主要函子。可能你想使用运算符univ,用中缀=..表示,或者它的密切关系functor/3arg/3来分离这些元组。

【讨论】:

    猜你喜欢
    • 2011-08-17
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 2011-05-23
    相关资源
    最近更新 更多