Если необходимо избавиться от.. часть, можно использовать Систему. Объект IO.DirectoryInfo. Используйте 'fred\frog..\frag' в конструкторе. Свойство FullName даст Вам нормализованное имя каталога.
единственный недостаток состоит в том, что это даст Вам весь путь (например, c:\test\fred\frag).
?- 2+3 =:= 6-1.
true.
?- 2+3 is 6-1.
false.
Также см. Документы http://www.swi-prolog.org/pldoc/man?predicate=is/2
Я нашел свой собственный ответ, http://www.cse.unsw.edu.au/~billw/prologdict.html
Я думаю, что приведенный выше ответ, тем не менее, заслуживает нескольких слов пояснения.
Небольшое замечание заранее: арифметические выражения в Прологе - это просто термины («Все - это термин в Прологе») , которые не оцениваются автоматически . (Если у вас есть опыт работы с Lisp, подумайте о цитируемых списках). Итак, 3 + 4
- это то же самое, что + (3,4)
, который сам по себе ничего не делает. Ответственность за оценку этих терминов лежит на отдельных предикатах.
Несколько встроенных предикатов выполняют неявную оценку, в том числе операторы арифметического сравнения, такие как =: =
и это
. =: =
оценивает оба аргумента и сравнивает результат, is
принимает и оценивает только его правый аргумент в качестве арифметического выражения.
Аргумент left должен быть атомом, либо числовой константой (которая затем сравнивается с результатом вычисления правого операнда), либо переменной. Если это связанная переменная , ее значение должно быть числовым и сравниваться с правым операндом, как в первом случае. Если это несвязанная переменная , результат вычисления правого операнда привязан к этой переменной. is
часто используется в последнем случае для связывания переменных.
Чтобы взять пример из приведенного выше Словаря Пролога: Чтобы проверить, является ли число N четным, вы можете использовать оба оператора:
0 is N mod 2 % true if N is even
0 =:= N mod 2 % dito
Но если вы хотите зафиксировать результат операции, вы можете использовать только первый вариант. Если X не связан, то:
X is N mod 2 % X will be 0 if N is even
X =:= N mod 2 % !will bomb with argument/instantiation error!
Практическое правило: если вам просто нужно арифметическое сравнение, используйте =: =
. Если вы хотите зафиксировать результат оценки, используйте равно
.