Перевод Пролога может быть простым, правило по правилу, все еще следуя парадигме создания экземпляра домена путем выбора из него .Здесь это дом атрибутов дома;в связанном ответе атрибуты дома фиксируются программистом-человеком, а домен - это фактические жилые дома, что позволяет использовать очень сжатое кодирование.
Другими словами, разница в нотации : сложная нотация уже ведет нас на полпути, но это был человек, который изобрел ее и последовал ей (как программист необходимость записывать norwegian
непосредственно в спецификации дома first , в соответствующем аргументе position ) - не компьютер.
Здесь мы пытаемся внедрить в код как можно меньше человеческих знаний, следуя ограничениям домашней работы. (хотя, конечно, все является спорным, и в конечном итоге, чтобы избежать вмешательства человека, была бы компьютерная программа, принимающая текст на английском языке ... которая снова была бы открыта для критики в отношении того, насколько конкретно эта программа предназначена для поискарешения этой конкретной головоломки, или типа головоломки, и т. д., и т. д.)
Мы кодируем его в стиле сверху вниз .Видимо, вопрос отсутствует.Это должно быть "кто пьет воду? Кому принадлежит зебра?"* Вот как в конечном итоге определяются дома:
5 ?- zebra(_, _, HS), maplist( writeln, HS),
false.
[smoke-kools, color-yellow, nation-nor, owns-fox, drink-water |_G859]
[nation-ukr, drink-tea, smoke-chester, owns-horse, color-blue |_G853]
[nation-eng, color-red, smoke-oldgold, owns-snails, drink-milk |_G775]
[nation-spa, owns-dog, color-ivory, smoke-lucky, drink-orange|_G826]
[drink-coffee, color-green, nation-jpn, smoke-parlamt, owns-zebra |_G865]
false.
или со списками атрибутов, «замороженными» по фиксированной длине и затем отсортированными,
7 ?- zebra( _, _, HS), maplist( length, HS, _), !, maplist( sort, HS, S),
maplist( writeln, S), false.
[color-yellow, drink-water, nation-nor, owns-fox, smoke-kools ]
[color-blue, drink-tea, nation-ukr, owns-horse, smoke-chester]
[color-red, drink-milk, nation-eng, owns-snails, smoke-oldgold]
[color-ivory, drink-orange, nation-spa, owns-dog, smoke-lucky ]
[color-green, drink-coffee, nation-jpn, owns-zebra, smoke-parlamt]
false.
Также легкосделать предикат attr/2
принять списки из Name-Value
пар , что позволяет использовать более естественный и высокоуровневый стиль кодирования с видом "расширяемых записей" - можно даже сказать "объекты" - спецификации, например
zebra( Z, W ,HS):-
length( HS, 5),
member( H1, HS), attr( H1, [nation-eng, color-red ] ),
member( H2, HS), attr( H2, [nation-spa, owns-dog ] ),
member( H3, HS), attr( H3, [drink-coffee, color-green] ),
......
и т. д. .