序言列表匹配问题
Problems with prolog list matching
我是序言初学者。我正在尝试为一种合成语言构建一个单词生成器来测试我的序言功能。这是我的代码:
generic_consonant(
['ሀ', 'ለ', 'ሐ', 'መ', 'ረ', 'ሰ',
'ቀ', 'በ', 'ተ', 'ኀ', 'ነ', 'ከ',
'ꬣ', 'ጠ', '፷', 'ጸ', 'ዂ', 'ፈ',
'ፐ', 'ዱ', 'ዳ', 'ዴ', 'ዶ']).
vowel(['ቈ', 'ቊ', 'ቋ', 'ቌ', 'ቍ', 'ኋ', 'ኊ']).
nasal_consonant(['ጙ', 'ዷ', 'ድ', 'ዲ', 'ደ']).
uvular_consonant(['ሠ', 'ወ', 'ዐ', 'ዘ', 'ጙ']).
syllablegen(1, Syllable) :-
uvular_consonant(Uvular), vowel(Vowel),
random(0, 7, VowelIndex), random(0, 5, UvularIndex),
nth0(UvularIndex, Uvular, UvularChar),
nth0(VowelIndex, Vowel, VowelChar),
Syllable = [UvularChar, VowelChar].
syllablegen(2, Syllable) :-
generic_consonant(Consonant), uvular_consonant(Uvular), vowel(Vowel),
random(0, 23, ConsonantIndex),
random(0, 7, VowelIndex),
random(0, 5, UvularIndex),
nth0(ConsonantIndex, Consonant, ConsonantChar),
nth0(UvularIndex, Uvular, UvularChar),
nth0(VowelIndex, Vowel, VowelChar),
Syllable = [ConsonantChar, UvularChar, VowelChar].
wordgen([], _).
wordgen(SyllableNums, Word) :-
SyllableNums = [Head|Tail],
syllablegen(Head, Syllable),
append(Word, Syllable, NewWord),
wordgen(Tail, NewWord).
当我调用“syllablegen(1, X)”时,所有的 syllablegen 谓词都在工作。和“syllablegen(2, X).”,但是当我调用 wordgen 时出现问题,它给了我一个意想不到的输出:
?- wordgen([1, 2], X).
X = [] ;
X = [_2898] ;
X = [_2898, _2910] ;
X = [_2898, _2910, _2922] ;
X = [_2898, _2910, _2922, _2934]
我期望的行为是这样的输出:
?- wordgen([1, 2], X).
X = [ዐ,ኊ,ለ,ዐ,ቌ] ;
或其衍生物,因为此程序中存在随机性。
过去几个小时我一直在研究这个,但我一辈子都弄不明白。任何帮助将不胜感激。
wordgen/2
中有两个小问题需要修复。首先,将参数的顺序更改为 append/3
(如果 C
是 A
和 B
的串联,则 append(A,B,C)
成功)。其次,将第二个参数固定为第一个子句中的空列表。
wordgen([], []).
wordgen(SyllableNums, Word) :-
SyllableNums = [Head|Tail],
syllablegen(Head, Syllable),
append(Syllable, NewWord, Word),
wordgen(Tail, NewWord).
我是序言初学者。我正在尝试为一种合成语言构建一个单词生成器来测试我的序言功能。这是我的代码:
generic_consonant(
['ሀ', 'ለ', 'ሐ', 'መ', 'ረ', 'ሰ',
'ቀ', 'በ', 'ተ', 'ኀ', 'ነ', 'ከ',
'ꬣ', 'ጠ', '፷', 'ጸ', 'ዂ', 'ፈ',
'ፐ', 'ዱ', 'ዳ', 'ዴ', 'ዶ']).
vowel(['ቈ', 'ቊ', 'ቋ', 'ቌ', 'ቍ', 'ኋ', 'ኊ']).
nasal_consonant(['ጙ', 'ዷ', 'ድ', 'ዲ', 'ደ']).
uvular_consonant(['ሠ', 'ወ', 'ዐ', 'ዘ', 'ጙ']).
syllablegen(1, Syllable) :-
uvular_consonant(Uvular), vowel(Vowel),
random(0, 7, VowelIndex), random(0, 5, UvularIndex),
nth0(UvularIndex, Uvular, UvularChar),
nth0(VowelIndex, Vowel, VowelChar),
Syllable = [UvularChar, VowelChar].
syllablegen(2, Syllable) :-
generic_consonant(Consonant), uvular_consonant(Uvular), vowel(Vowel),
random(0, 23, ConsonantIndex),
random(0, 7, VowelIndex),
random(0, 5, UvularIndex),
nth0(ConsonantIndex, Consonant, ConsonantChar),
nth0(UvularIndex, Uvular, UvularChar),
nth0(VowelIndex, Vowel, VowelChar),
Syllable = [ConsonantChar, UvularChar, VowelChar].
wordgen([], _).
wordgen(SyllableNums, Word) :-
SyllableNums = [Head|Tail],
syllablegen(Head, Syllable),
append(Word, Syllable, NewWord),
wordgen(Tail, NewWord).
当我调用“syllablegen(1, X)”时,所有的 syllablegen 谓词都在工作。和“syllablegen(2, X).”,但是当我调用 wordgen 时出现问题,它给了我一个意想不到的输出:
?- wordgen([1, 2], X).
X = [] ;
X = [_2898] ;
X = [_2898, _2910] ;
X = [_2898, _2910, _2922] ;
X = [_2898, _2910, _2922, _2934]
我期望的行为是这样的输出:
?- wordgen([1, 2], X).
X = [ዐ,ኊ,ለ,ዐ,ቌ] ;
或其衍生物,因为此程序中存在随机性。
过去几个小时我一直在研究这个,但我一辈子都弄不明白。任何帮助将不胜感激。
wordgen/2
中有两个小问题需要修复。首先,将参数的顺序更改为 append/3
(如果 C
是 A
和 B
的串联,则 append(A,B,C)
成功)。其次,将第二个参数固定为第一个子句中的空列表。
wordgen([], []).
wordgen(SyllableNums, Word) :-
SyllableNums = [Head|Tail],
syllablegen(Head, Syllable),
append(Syllable, NewWord, Word),
wordgen(Tail, NewWord).