我如何在 SWI-Prolog 中表达这些知识?

问题描述 投票:0回答:1

我从未使用过 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
    ).

但我不太确定它是否有效,任何帮助或学习资源将不胜感激。

swi-prolog
1个回答
0
投票

表达这一点

可以有一个类型为“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]]).
© www.soinside.com 2019 - 2024. All rights reserved.