【发布时间】:2013-11-19 05:01:58
【问题描述】:
直奔主题:
我在处理 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).
【问题讨论】: