Prolog:成员自己的实施失败/一般的Prolog问题

时间:2018-11-10 11:42:51

标签: prolog

因此,我对Prolog并不陌生,并且已经实现了自己的成员实现。

#contains element
mymember(A, [A|T]).
mymember(A, [X|T]) :-  mymember(A, T).

查找后,这应该是经典的实现,但是当我对其进行测试时,它失败了:

[trace]  ?- mymember(2, [1, 2, 3]).
   Call: (8) mymember(2, [1, 2, 3]) ? 
   Call: (9) mymember(2, [2, 3]) ? 
   Call: (10) mymember(2, [3]) ? 
   Call: (11) mymember(2, []) ? 
   Fail: (11) mymember(2, []) ? 
   Fail: (10) mymember(2, [3]) ? 
   Fail: (9) mymember(2, [2, 3]) ? 
   Fail: (8) mymember(2, [1, 2, 3]) ? 
false.

现在让我感到困惑的是,Prolog仅使用第二种情况直到失败,但从未尝试匹配我的第一种情况。有人知道这种行为的原因吗?

(我正在使用SWI-Prolog版本7.6.4)


编辑:现在我知道我的问题了。由于我没有突出显示语法,因此我没有注意到我实际上没有在一行注释中使用正确的字符。用'%'替换'#'之后,我的第一种情况现在在第二个调用中匹配。我猜是一个典型的初学者错误...

1 个答案:

答案 0 :(得分:0)

您的实现对我有用。

Traceback (most recent call last):
    File "events_match_hdfs.py", line 29, in <module>
      data = json.load(f)
    File "/home/vinay/anaconda3/lib/python3.5/json/__init__.py", line 268, in load
      parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
    File "/home/vinay/anaconda3/lib/python3.5/json/__init__.py", line 319, in loads
      return _default_decoder.decode(s)
    File "/home/vinay/anaconda3/lib/python3.5/json/decoder.py", line 339, in decode
      obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    File "/home/vinay/anaconda3/lib/python3.5/json/decoder.py", line 357, in raw_decode
      raise JSONDecodeError("Expecting value", s, err.value) from None

    json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

尽管您可能会丢失某些变量,因为它们是单例的,像这样:

mymember(2,[1,2,3]).
    Call: (8) mymember(2, [1, 2, 3]) ? creep
    Call: (9) mymember(2, [2, 3]) ? creep
    Exit: (9) mymember(2, [2, 3]) ? creep
    Exit: (8) mymember(2, [1, 2, 3]) ? creep
true .