Хорошо, я новичок в Prolog, так что извините, если это что-то тривиальное, но я не могу найти правильный элегантный ответ на этот вопрос. Я пытаюсь выполнить это упражнение здесь, на learnprolognow.org, упражнение 2.4 (кроссворд).
В упражнении представлены следующие факты:
word(astante, a,s,t,a,n,t,e).
word(astoria, a,s,t,o,r,i,a).
word(baratto, b,a,r,a,t,t,o).
word(cobalto, c,o,b,a,l,t,o).
word(pistola, p,i,s,t,o,l,a).
word(statale, s,t,a,t,a,l,e).
И решение, которое я придумал, чтобы разгадывать кроссворд для каждого слова, таково:
crossword(V1, V2, V3, H1, H2, H3) :-
word(V1, V1a, V1bH1b, V1c, V1dH2b, V1e, V1fH3b, V1g),
word(V2, V2a, V2bH1d, V2c, V2dH2d, V2e, V2fH3d, V2g),
word(V3, V3a, V3bH1f, V3c, V3dH2f, V3e, V3fH3f, V3g),
word(H1, H1a, V1bH1b, H1c, V2bH1d, H1e, V3bH1f, H1g),
word(H2, H2a, V1dH2b, H2c, V2dH2d, H2e, V3dH2f, H2g),
word(H3, H3a, V1fH3b, H3c, V2fH3d, H3e, V3fH3f, H3g).
От V1a
до V1g
и т. Д. - символы каждого слова, а от V1bH1b
до V3fH3f
- символы, общие для слов в кроссворде.
Решение, похоже, работает, однако результат дает повторяющиеся значения, причем первый результат:
?- crossword(V1, V2, V3, H1, H2, H3).
V1 = astante,
V2 = baratto,
V3 = statale,
H1 = astante,
H2 = baratto,
H3 = statale .
Как я могу заставить Пролог иметь V1 \= V2 \= V3 \= H1 \= H2 \= H3
? Если я буду выполнять их индивидуально, одну за другой, мне понадобится 120 перестановок, поэтому должен быть более быстрый способ, и это упражнение для новичков, поэтому я, должно быть, что-то упускаю.
Я нашел этот похожий вопрос, но представленные ответы кажутся такими сложными, я надеюсь, что есть более простой способ. Я использую swi-prolog в Ubuntu, на всякий случай.
Спасибо.
dif(V1,V2)
и т. Д.maplist(dif(V1),[V2,V3,V3])
- person false   schedule 29.01.2013etc.
илиinsert more here
. - person jbx   schedule 30.01.2013