2013-05-10 4 views
1

Как перевести следующий аргумент в Prolog? Кажется, что ему не нужны предикаты. (Примечание: Я использую & для связи и | для дизъюнкции.)Преобразование аргумента логики пропозиции в Prolog

G -> (H & J)

(H | J) -> S

S | R

Ⱶ G -> R

Кроме того, как бы я обратиться к базе данных Пролога, чтобы определить, что (G -> R) является ложным и аргумент, следовательно, недействительным? Это было в то время.

(Да, это для домашних заданий Профессор попросил нас, чтобы доказать аргумент, но он не действует, если G, H, J и S являются истинными и R является ложным.).

Edit:

на основании ответа Даниила, я написал это:

boolean(true). 
boolean(fail). 
argument(G, H, J, R, S) :- 
    boolean(G), 
    boolean(H), 
    boolean(J), 
    boolean(R), 
    boolean(S), 
    (G -> R) -> 
    (G -> (H , J)), 
    ((H ; J) -> S), 
    (S ; R). 

Но когда я запускаю его, я получаю это:

?- argument(G, H, J, R, S). 
G = H, H = J, J = R, R = S, S = true. 

Как я могу получить его, чтобы показать ошибку?

Edit # 2:

Теперь у меня есть это:

boolean(true). 
boolean(false). 
argument(G, H, J, R, S) :- 
    boolean(G), boolean(H), boolean(J), boolean(R), boolean(S), 
    (((G -> R); true) -> 
    ((G -> (H , J); true), 
    ((H ; J) -> S; true), 
    (S ; R))); true. 

Он проходит через все успешные случаи, как и следовало ожидать Пролог сделать, но я действительно хочу, чтобы это также показать когда аргумент недействителен, т.е. когда предикат терпит неудачу. Я не знаю, как это сделать.

+0

Простейшая вещь, которую я могу придумать, чтобы получить случаи сбоя, состоит в том, чтобы вытащить строку 'boolean (G), ...' в отдельный предикат, затем 'write/1' свои значения перед вводом аргумента/5', а затем напишите «да» или «нет» в зависимости от успеха. Вы также можете указать в этом пункте аргумент '\ + (...), который отрицает вызов. –

ответ

0

В Prolog, соединение , и дизъюнкция ;. Последствием остается только ->, но приоритет не всегда интуитивный, поэтому мы склонны обертывать подразумеваемые случаи в круглые скобки. Так что ваши первые три случая просто:

G -> (H, J). 
(H ; J) -> S. 
S ; R. 

Я не уверен, что добавляет здесь Ⱶ, но если бы я предполагаю, что я склонен перевести этот аргумент:

(G -> R) :- 
    G -> (H, J), 
    (H ; J) -> S, 
    (S ; R). 

Поскольку эти все переменные Prolog, это не будет выполнено. Пролог должен будет сообщить, какие домены H, J и S принадлежат, по крайней мере.

+0

Ⱶ должен быть турникет, т. Е.« Поэтому ». Или, другими словами, три аргумента подразумевают вывод. вашего кода будет правильным для этого?(Я просто не уверен, я действительно не знаю: P) – 2rs2ts

+0

Кроме того, если я правильно понимаю, атомы могут быть заключены в одинарные кавычки, поэтому «G» является атомом, например. – 2rs2ts

+0

Я обнаружил, что оператор '->' не означает то же, что подразумевается в логике. 'A -> B' верен только в Prolog, если оба' A' и 'B' истинны. По-видимому, оператор '->' оценивает только правое выражение, если левое выражение истинно. – 2rs2ts