2015-12-22 3 views
1

Я пытаюсь добавить некоторые числа в список, эти числа находятся в диапазоне от X до Y, где X - нижняя граница, а Y - верхняя граница, а затем сохраните эти сгенерированные числа в списке. Я попытался это:Как добавить числа в определенном диапазоне к списку в прологе

domains 
    list=integer*. 

predicates 
    nondeterm generate(integer,integer,list). 
    nondeterm append(integer,list,list). 

clauses 
    append(X,[],[X]). 
    generate(0,0,[]). 
    generate(X,X,[]) :- 
      write("The Upper And Lower Numbers Are The Same\n"). 
    generate(X,Y,[X|T]) :- 
      X<=Y, 
      N=X+1, 
      A=N+1, 
      append(N,T,Z), 
      generate(A,Y,Z). 

goal 
    generate(1,4,Result). 

Но когда я проверяю цели он не дает мне «Нет решения». Что я делаю неправильно? Большое спасибо за вашу помощь.

+0

Вы должны пометить вопрос с [зрительно-пролог] Я думаю, , –

+0

Проведите трассировку и посмотрите, что происходит при каждом рекурсивном вызове 'generate (A, Y, Z)'. Вероятно, вы увидите проблему с рекурсивным случаем. Логика, на первый взгляд, кажется, не имеет никакого смысла, когда «X» увеличивается («N = X + 1'), тогда этот результат также увеличивается (« A = N + 1'). Затем вы вызываете 'append (N, T, Z)' в домашнем append (будьте осторожны: стандартный пролог уже имеет 'append', хотя я не знаю, работает ли Visual Prolog, и это не то же самое, что и ваш) , но 'T' не создается. Я подозреваю, что это совсем не то, что вы намеревались. – lurker

+0

@ lurker Благодарим вас за разъяснение, я попытался вызвать встроенный метод добавления, но он не сработал, так что это домашний метод true или что ?, и я увеличиваю число (N = X + 1), чтобы добавить следующее число в диапазон в список и приращение этого числа (A = N + 1), чтобы снова вызвать функцию с ним. Извините, но что вы подразумеваете под «T не создается»? –

ответ

0

Попробуйте это:

?= findall(X,between(1,4,X),L). 
L = [1, 2, 3, 4]. 

Bye

PS: Для чистой реализации между/3 См:
http://www.jekejeke.ch/idatab/doclet/blog/docs/05_run/05_frequent/advanced/arith.html

+2

OP использует Visual Prolog. Знаете ли вы, есть ли у Visual Prolog эти заранее определенные предикаты? – lurker

+0

http://wiki.visual-prolog.com/index.php?title=Lists_and_Recursion –

+2

Я вижу 'findall' там, но не' между'. – lurker

Смежные вопросы