我正在尝试在 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)
我该如何处理?
最佳答案
看来切可以解决你的问题:
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.
关于list - Prolog 中的元素处理问题,但不在常规列表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16145995/