Data structures 初学者序言:数据结构

Data structures 初学者序言:数据结构,data-structures,prolog,Data Structures,Prolog,我正试图了解Prolog,我在数据结构方面有些挣扎 我想取一个点(X,Y)并沿“对角线”X=Y,这样点(-5,8)就变成点(8,-5) 应输出点(8,-5) 这类事情需要数据结构吗?还是我想得太多了?你可以写: reflection(point(A,B), point(B,A)). 如果在reflection.prolog文件中,则: $ gprolog --consult-file reflection.prolog ... | ?- reflection( point(1,2), X).

我正试图了解Prolog,我在数据结构方面有些挣扎

我想取一个
点(X,Y)
并沿“对角线”
X=Y
,这样
点(-5,8)
就变成
点(8,-5)

应输出
点(8,-5)

这类事情需要数据结构吗?还是我想得太多了?

你可以写:

reflection(point(A,B), point(B,A)).
如果在reflection.prolog文件中,则:

$ gprolog --consult-file reflection.prolog
...
| ?- reflection( point(1,2), X).
X = point(2,1)
yes 
你可以写:

reflection(point(A,B), point(B,A)).
如果在reflection.prolog文件中,则:

$ gprolog --consult-file reflection.prolog
...
| ?- reflection( point(1,2), X).
X = point(2,1)
yes 

我使用的prolog版本(草莓式prolog)不允许我对
=
使用前缀符号,因此除非您的prolog对
=
有不同的含义,否则您的代码似乎是:

reflection(X,Y):- Y = X.
这意味着只有当
X
Y
可统一时,
reflection\2
才会统一

因此,您的代码应该产生
点(-5,8)
而不是
点(8,-5)
,因为
点(-5,8)
X=-5
Y=8
时与
点(X,Y)
是一致的。你不能说你在问题中得到了什么

您需要使用此规则使其正常工作:

reflection(point(X,Y),point(Y,X)).

我使用的prolog版本(草莓式prolog)不允许我对
=
使用前缀符号,因此除非您的prolog对
=
有不同的含义,否则您的代码似乎是:

reflection(X,Y):- Y = X.
这意味着只有当
X
Y
可统一时,
reflection\2
才会统一

因此,您的代码应该产生
点(-5,8)
而不是
点(8,-5)
,因为
点(-5,8)
X=-5
Y=8
时与
点(X,Y)
是一致的。你不能说你在问题中得到了什么

您需要使用此规则使其正常工作:

reflection(point(X,Y),point(Y,X)).

我已经想出了一个解决办法,但对我来说似乎很糟糕反射(点(A,B),点(P,Q)):-=(点(P,Q),点(B,A))。'您找到的解决方案是正确的。同样可以更简洁地表达;下面是用户“谜性”和“峰值”的答案。我已经想出了一个解决方案,但对我来说似乎很糟糕反射(点(A,B),点(P,Q)):-=(点(P,Q),点(B,A))。'您找到的解决方案是正确的。同样可以更简洁地表达;下面的答案由用户“谜”和“峰”告诉你如何。