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