Использование SWI-Prolog, синтаксис, синглтон-ошибки
Мне нужно использовать SWI-пролог, чтобы решить логическую головоломку для домашней работы, но я нахожу синтаксис и значение очень громоздкими даже с моим опытом программирования. Проблема, с которой я сталкиваюсь, это ошибка в одноэлементных переменных, и загадка возвращает ложь.
Это то, что я сделал до сих пор:
:- use_module(library(clpfd)).
sends(K,priscilla,C),
C#\=rose.
sends(carol,L,rose).
sends(dick,L,sun).
sends(K,L,landscape).
sends(bob,rhonda,C).
sends(edna,quincy,C).
sends(K,simon,deer).
sends(K,tina,C).
solve :-
sends(
[alice,bob,carol,dick,edna],
[priscilla,rhonda,quincy,simon,tina],
[rose,heart,sun,landscape,deer]).
Это вопрос, я буду очень признателен за мягкое толчок в правильном направлении или ответ, который поможет мне лучше понять язык!
1 ответ
Вы получите единственную ошибку везде, где у вас есть единственная переменная использования. Кажется, это ваше единственное использование переменных, так что я ожидаю, что вы получите это много. Ваш код выше эквивалентен:
sends(_,priscilla,C),
C#\=rose.
sends(carol,_,rose).
sends(dick,_,sun).
sends(_,_,landscape).
sends(bob,rhonda,_).
sends(edna,quincy,_).
sends(_,simon,deer).
sends(_,tina,_).
Если это выглядит странно или неправильно с одноэлементными переменными, замененными на _
Это хороший показатель того, что вам не хватает логики. Обратите внимание, что аргументы sends/3
как вы написали, кажется, что он атомарный, что делает этот вызов особенно странным:
sends(
[alice,bob,carol,dick,edna],
[priscilla,rhonda,quincy,simon,tina],
[rose,heart,sun,landscape,deer]).
Нет никаких оснований ожидать, что Пролог волшебным образом преобразует это использование sends/3
со списками в какой-то другой вызов с атомами. Я понятия не имею, что вы ожидаете здесь произойти.
Такие головоломки являются очень популярными задачами для Пролога. Ищите архивы здесь - их было несколько только за последние несколько дней - и вы должны найти вдохновение.