Как использовать условие if else в DOSBOX TurboProlog - PullRequest
1 голос
/ 27 апреля 2020

Ниже приведена программа для печати, если список палиндром или нет, но я не могу использовать условие L1 = L & L1 <> L для печати «Список - палиндром!» & «Список - это не палиндром». Кстати, я почти попробовал все доступные в Интернете способы сделать это, но безрезультатно, что это был успех.

Я пытался (если -> тогда; еще) & (если, тогда); (еще, тогда) и еще много, но все это привело к провалу. Ваша помощь высоко ценится!

domains
    ll=integer*
predicates
    rev(ll,ll).
    revl(ll,ll,ll).
clauses
    rev(L1,L):-
        revl(L1,[],L).
% I want to use if and else here to print If it is palindrome or not!

    revl([],L,L).
    revl([H|L1],L2,L3):-
        revl(L1,[H|L2],L3).

1 Ответ

0 голосов
/ 28 апреля 2020

Вам не нужно использовать if и else.

Если исполнение достигнет указанной вами точки, у вас определенно будет палиндром.

rev(L1,L):-
    revl(L1,[],L),       % it's a palindrome if revl(L1,[],L) succeeds
    write("It's a palindrome!").

% Recursively reverse A to B in revl(A,B,X)

revl([],L,L).                            % succeed if at the end B=X 
revl([H|L1],L2,L3):- revl(L1,[H|L2],L3). % reverse 1 step

Что вы хотите:

rev(L1,L):-
    revl(L1,[],L),!    % it's a palindrome if revl(L1,[],L) succeeds
    write("It's a palindrome!").

rev(_,_):-             % alternative solution in case it's not a palindrome   
    write("It's not a palindrome!").

% Recursively reverse A to B in revl(A,B,X)

revl([],L,L).                            % succeed if at the end B=X 
revl([H|L1],L2,L3):- revl(L1,[H|L2],L3). % reverse 1 step

Использование if-then-else

rev(L1,L):-
    revl(L1,[],L) 
    -> write("It's a palindrome!")
    ;  write("It's not a palindrome!").

revl([],L,L).
revl([H|L1],L2,L3):- revl(L1,[H|L2],L3).
...