2015-11-05 4 views
1
minu('-'). 
minu('+'). 
minu('/'). 

f(A):- 
    atom_chars(A,X), 
    write(X), 
    fun(X). 

fun([]). 

fun([A]):- 
    not(minu(A)). 

fun([Hd|Tail]):- 
    not(minu(Hd)), 
    fun(Tail). 

Я пытаюсь сделать функцию «f», которая берет строку и возвращает True, если «-», «+» или «/» в ней нет.Prolog - Ran in a issue

Но как только я использую рекурсивный вызов. Он просто возвращает false.

EDIT ::

РЕШЕНИЕ НАЙДЕНО ::

Спасибо, Lurker ... И спасибо, Даниэль Лайонс ... Я извиняюсь это был длинный день обучения Пролог ... I должен поспать.

f(A):- 
atom_chars(A,X), 
write(X), 
fun(X). 

fun([]). 

fun([A]):- 
not(minu(A)). 

fun([Hd|Tail]):- 
not(minu(Hd)), 
fun(Tail). 
+1

Пожалуйста, покажите примеры запросов с желаемыми результатами. – lurker

+0

query: f ("a + a") Желаемый результат False. –

+1

И этот запрос должен потерпеть неудачу, правильно? – lurker

ответ

2

Я хотел бы попробовать это:

minu('-'). 
minu('+'). 
minu('/'). 

f(A) :- 
    atom_chars(A, Chars), 
    \+ (minu(Op), memberchk(Op, Chars)). 

Кстати, важно отметить, что Пролог не будет «возвращать» ничего; это будет либо сказать вам true или false если цель успешно или нет, так что, например:

?- f("this is a string"). 
true. 

?- f("this i-a string"). 
false. 

?- f("this i+a string"). 
false. 
+0

Спасибо! Это решение этой проблемы, но я пытаюсь изучить Prolog ...: D Итак, я все еще хочу узнать, почему мой код не работает. –

+0

Ваш код действительно работает, по крайней мере, под SWI. Но я бы предупредил вас, что ваше 'fun ([A]) правило не является необходимым (поэтому вы получаете два решения вместо одного), а' not (X) 'не является ISO, поэтому он может не работать в зависимости от реализации Prolog , –