Prolog通配符:重复列表而不更改通配符值

时间:2013-11-19 05:01:59

标签: prolog wildcard sudoku

追逐的权利:

我在处理Prolog的统一系统时遇到了麻烦,并且当他们通过我的程序时,通配符会发生什么。我的代码如下:

board(B) :- [R1, R2, R3, R4, R5, R6, R7, R8, R9] = B,
        noDuplicatesRows([R1, R2, R3, R4, R5, R6, R7, R8, R9]),
        horzAllWorthy([R1, R2, R3, R4, R5, R6, R7, R8, R9]),
        vertAllWorthy([R1, R2, R3, R4, R5, R6, R7, R8, R9]).

董事会是一个数独板。 我基本上测试板中的行是否有重复的数字,然后测试以查看行和列是否通过了某些约束。问题是行中有通配符来表示空白点(如[_,1,4,3_ ....等]所示)。从我收集的内容来看,当我通过noDuplicatesRows运行B时,通配符点在它们通过其他两个程序之前被赋予值,这不是我想要的。但是,由于Prolog的统一系统,我似乎无法解决这个问题(我已经尝试过复制列表了!)。

这里有任何答案,或者我是以非Prolog方式进行此事?

编辑:帮助功能代码

noDuplicatesRows([]).
noDuplicatesRows([H|T]):- usedNumbersRow(H, X), diff(X), !, noDuplicatesRows(T).

usedNumbersRow([], []).
usedNumbersRow([X|Xs], R) :- var(X), validval(X), !, usedNumbersRow(Xs, R).
usedNumbersRow([X|Xs], [X|R]) :- usedNumbersRow(Xs, R).

diff([H]).
diff([H|T]):- not(member(H,T)), diff(T).

1 个答案:

答案 0 :(得分:2)

这不是一个真正的“答案”,但是太长而无法发表评论:

“通配符”这个词在这里不是很有帮助。你有变量。它们可以是免费的,也可以实例化为值。没有什么可以说谓词必须实例化传递给它的所有参数,这就是你使用_的原因:表示你不想真正对变量做任何事情。例如:

nothing(_).

传递给此谓词的参数将不会进一步实例化。或者,换句话说,不管你给nothing/1的论点是什么,它都会在它进入时出现。

所以这里真正的问题可能是:你的程序中的助手谓词用传递给它们的参数做了什么?

无论如何,如果你的目标是解决数独,你必须最终实例化所有变量(初始板上未知的字段),以便满足所有约束。

如果您有更具体的问题,可以更轻松地帮助您解决您所面临的问题。

编辑:

_不会转到您正在调用的谓词。它只在它出现的谓词子句的上下文中很重要。在你的情况下,可能是validval(X)实例化变量(再次,我不知道它的作用!)