我从未使用过 swi-prolog,并且我很难弄清楚如何在其中表达更复杂的知识。 我想用 swi-prolog 来表达这一点:
∃x∃yTile(t,x,y,r) ∧ ∀a∀bTile(t,a,b,r) => a=x, b=y
或
∃x∃yTile(t,x,y,r) ∧ ∀a∀bTile(t,a,b,r) => a!=x; b!=y
基本上我想表达的是,可以有一个“t”类型的图块,并且位置 x 和 y 在“r”轮处,并且对于所有图块,如果它们的位置与 x 和 y 相同,则意味着它是相同的图块并且世界上只有一个该类型的图块存在,或者相反,并且存在多个相同类型的图块。
我能找到并写下的最接近的是:
find_tiles(T, X, Y, R) :-
tile(T, X, Y, R),
forall(
(tile(T, A, B, R), A = X, B = Y),
true
).
但我不太确定它是否有效,任何帮助或学习资源将不胜感激。
表达这一点
可以有一个类型为“t”的图块,并且位置 x 和 y 在圆“r”处,并且 对于所有图块,如果它们的位置与 x 和 y 相同,则意味着它是 相同的图块并且世界上仅存在一个该类型的图块
您必须在
forall/2
的操作部分测试每个合格的图块是否具有相同的坐标:
find_tiles(T, X, Y, R) :-
tile(T, X, Y, R),
forall(
tile(T, A, B, R),
(A = X, B = Y) % here the test
).
setof/3
:
find_tiles(T, X, Y, R):-
setof([X,Y], tile(T,X,Y,R), [[X,Y]]).