0

我有一个学校项目,我必须与 Prolog 一起工作。这对我来说都是新的,所以我遇到了一些问题。

我有一个这样的列表:

List = [(_,_,_),(_,_,_),(_,_,_)]

我应该通过我必须创建的几个谓词从每个成员的输入信息中接收。

其中之一是以下类型:

predicate(M1,M2,M3, List)

它说 M1 是 M2 或 M3,但不是两者兼而有之。例如,

predicate((_,a,_),(2,_,_),(3,_,_),List)

表示带有“a”的成员在第一个字段中有 2 或 3。

我整晚都在尝试,但无法提出解决方案。我相信我必须使用统一,但不知道该怎么做。

我试过这个:

predicate(M1,M2,M3,[_]) :- (M1=M2), not(M1=M3).
predicate(M1,M2,M3,[_]) :- (M1=M3), not(M1=M2).

这可能看起来很荒谬,但正如我所说,Prolog 对我来说是全新的,我不能完全掌握它的功能。

任何提示表示赞赏。谢谢!

编辑:

例子:

person(name,age,job).
List = [(einstein,_,_),_,_].

所以现在我有一个 3 人的列表,爱因斯坦排在第一位。

predicate = ((einstein,_,_),(_,87,_),(_,23,_), List).

List = [(einstein,87,_),_,_)];
List = [(einstein,23,_),_,_)].

以上是应用谓词后的 2 个可接受的列表。

这应该是一个简单的问题,但我无法弄清楚。

谢谢!

4

3 回答 3

1

我想你应该在 List 中绑定元素:

predicate(M1, M2, M3, [M1, M2, M3]) :-
    M1 = M2, M1 \= M3
  ; M1 = M3, M1 \= M2.

编辑:评论后

predicate(M1, M2, M3, List) :-
    member(M1, List),
    ( M1 = M2, M1 \= M3 ; M1 = M3, M1 \= M2 ).

Member/2 它是 Prolog 中列表与其元素之间最基本的关系。在这里,它显示了底层引擎在搜索解决方案时绑定变量的能力。

您的数据产生

?- predicate((einstein,_,_),(_,87,_),(_,23,_), [E]).
E = (einstein, 87, _G3908) ;
E = (einstein, 23, _G3908).
于 2013-05-17T05:39:45.310 回答
1

我会这样写:

predicate(M1,M2,M3,L):- member(M1,L),member(M1,[M2,M3]).

你说“它说 M1 是 M2 或 M3,但不是两者兼而有之”,但我认为这是你的责任,作为这个谓词的调用者。如果您提供了 equal M2and M3,显然您希望它们相等。如果你给它们提供了不同的东西,那么它们就是这样。

于 2013-05-17T16:44:33.997 回答
0

Prolog 与其他编程语言非常不同。您的尝试并非不合理,但会更好地理解为:

predicate(M1,M1,M3,[_]) :- M1 \= M3.
predicate(M1,M2,M1,[_]) :- M1 \= M2.

实际上,这说明了同样的事情,但是这个版本提请注意我们没有对第四个参数做任何事情,在这个公式中,它可以是任何单元素列表。赔率很好,这不是你的意思。

于 2013-05-17T05:59:09.050 回答